알고리즘
자료구조
원2
2022. 10. 25. 23:34
728x90
반응형
배열과 리스트
배열
메모리의 연속 공간에 값이 채워져 있는 형태의 자료구조
배열의 값은 인덱스를 통해 참조가능, 선언한 자료형의 값만 저장가능
- 인덱스를 사용하여 값에 바로 접근 가능
- 새로운 값을 삽입하거나 특정 인덱스에 있는 값을 삭제하기 어려움. 삽입하거나 삭제하려면 해당 인덱스 주변에 있는 값을 이동 시키는 과정이 필요
- 배열의 크기는 선언할 때 지정할 수 있으며, 한번 선언하면 크기를 늘리거나 줄일수 없음
- 구조가 간단
/*
* 1차원 배열의 선언
* 되도록이면 첫번째 방식을 권장
*/
int[] fArr;
String sArr[];
// 배열의 길이가 3인 배열 선언
int[] grade1 = new int[3];
int[] grade2 = new int[3];
// 배열의 초기화
grade1[0] = 85;
grade1[1] = 80;
grade1[2] = 90;
grade2[0] = 75;
// 반복분
for (int i = 0; i < grade1.length; i++) {
System.out.println(grade1[i]);
}
// 확장 for 문
for (int i : grade2) {
System.out.println(i);
}
// result
// 85
// 80
// 90
// 75
// 0
// 0
// 배열의 초기화 (선언과 동시에)
int grade3[] = { 70, 80, 90 };
int grade4[] = new int[] { 70, 80, 90 };
// 아래 코드는 에러 발생
// int[] grade5;
// grade5 = { 70, 80, 90 };
int[] grade6;
grade6 = new int[]{ 70, 80, 90 };
// 배열 요소의 합과 평균을 구하기
int[] grade = new int[] { 85, 65, 90 };
int sum = 0;
for (int i : grade) {
sum += i;
}
System.out.println("배열의 총합 : " + sum);
System.out.println("배열의 평균 : " + sum/grade.length);
// result
// 배열의 총합 : 240
// 배열의 평균 : 80
배열과 리스트의 가장 큰 차이 : 크기가 정해져 있지 않고 동적임
리스트
배열과 비슷한 자바의 자료형
명확한 크기를 알 수 없는 경우가 많아 list 를 사용하는 것이 유리
// 기본 ArrayList
// 제네릭스를 사용하여 타입을 명시
// Stirng Integer ... 외로 Dog 같은 어떠한 자료형도 가능
ArrayList<String> shot = new ArrayList<>();
shot.add("130");
shot.add("111");
shot.add("125");
System.out.println(shot);
// result
// [130, 111, 125]
// ArrayList method
// get 해당 인덱스 값 추출
System.out.println(shot.get(0));
// size ArrayList 갯수 리턴
System.out.println(shot.size());
// contains 리스트 안에 항목 여부 boolean으로 리턴
System.out.println(shot.contains("111"));
/*
* remove
* 1. object 삭제 후 return true/false
* 2. index 삭제 후 return 111
*/
System.out.println(shot.remove("125"));
System.out.println(shot.remove(1));
* 제너릭스를 사용하는 이유
- 정확한 타입체크
- casting 이 필요 없음 (원래는 Object 형에서 String 으로 casting 을 해야함)
- 제너릭을 사용하지 않으면 리스트에 여러가지 자료형이 들어갈 수 있는데, 값을 가져올 때 casting 시 컴파일런타임 오류발생
// 제너릭을 사용하지 않을 때
ArrayList noGeneric = new ArrayList<>();
noGeneric.add("go");
noGeneric.add("home");
// casting
String one = (String) noGeneric.get(0);
String two = (String) noGeneric.get(1);
다양한 방법으로 ArrayList 생성
// add 메소드 사용
ArrayList<String> arr = new ArrayList<>();
arr.add("132");
arr.add("123");
arr.add("112");
System.out.println(arr);
// [132, 123, 112]
// 데이터가 존재 하는 경우
String[] data = {"141","132","163"};
ArrayList<String> strArr = new ArrayList<>(Arrays.asList(data));
System.out.println(strArr);
// [141, 132, 163]
// String 배열 대신 String 자료형을 여러개 전달
ArrayList<String> strArr2 = new ArrayList<>(Arrays.asList("141","132","163"));
System.out.println(strArr2);
// [141, 132, 163]
배열의 각 요소를 , 로 구분하여 하나의 문자열로 만들기
// 노가다 ver
ArrayList<String> joinArr = new ArrayList<>(Arrays.asList("111","222","333"));
String result = "";
for (int i = 0; i < joinArr.size(); i++) {
result += joinArr.get(i);
result += ",";
}
// 마지막 콤마 삭제
result = result.substring(0, result.length() - 1);
System.out.println(result);
// 111,222,333
String.join 으로 간단하게 구현
// String.join 으로 간단하게 구현 (구분자, 리스트객체)
String result2 = String.join(",",joinArr);
System.out.println(result2);
// 111,222,333
문자열 배열에도 사용 가능
String[] arrStr = new String[]{"741","852","963"};
String result3 = String.join(",",arrStr);
System.out.println(result3);
// 741,852,963
리스트 정렬
java 에서 sort 는 퀵 정렬
// 리스트 정렬하기
ArrayList<String> sortArr = new ArrayList<>(Arrays.asList("777","333","666"));
sortArr.sort(Comparator.naturalOrder()); // 오름차순 정렬
// sortArr.sort(Comparator.reverseOrder()); // 내림차순 정렬
System.out.println(sortArr);
// [333, 666, 777]
백준 1546
문제
세준이는 기말고사를 망쳤다. 세준이는 점수를 조작해서 집에 가져가기로 했다. 일단 세준이는 자기 점수 중에 최댓값을 골랐다. 이 값을 M이라고 한다. 그리고 나서 모든 점수를 점수/M*100으로 고쳤다.
예를 들어, 세준이의 최고점이 70이고, 수학점수가 50이었으면 수학점수는 50/70*100이 되어 71.43점이 된다.
세준이의 성적을 위의 방법대로 새로 계산했을 때, 새로운 평균을 구하는 프로그램을 작성하시오.
입력
첫째 줄에 시험 본 과목의 개수 N이 주어진다. 이 값은 1000보다 작거나 같다. 둘째 줄에 세준이의 현재 성적이 주어진다. 이 값은 100보다 작거나 같은 음이 아닌 정수이고, 적어도 하나의 값은 0보다 크다.
출력
첫째 줄에 새로운 평균을 출력한다. 실제 정답과 출력값의 절대오차 또는 상대오차가 10 이하이면 정답이다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;
public class StdRecursive {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
// 첫째 줄에 받은 input, 배열의 크기를 초기화
double[] arr = new double[Integer.parseInt(br.readLine())];
// 문자열을 지정한 구분자로 쪼개는 클래스 -> token 이 됌
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
// 쪼갠 token 을 arr 에 입력
for (int i = 0; i < arr.length; i++) {
arr[i] = Double.parseDouble(st.nextToken());
}
// for (double i : arr) {
// arr[(int) i] = Double.parseDouble(st.nextToken());
// }
double sum = 0;
// 퀵소팅 맨 뒤의 값이 최댓값이 됌
Arrays.sort(arr);
for (int i = 0; i < arr.length; i++) {
// 최댓값은 arr 의 마지막 원소
sum += ((arr[i]/ arr[arr.length-1]) * 100);
}
// for (double i : arr) {
// sum += ((arr[(int) i]/ arr[arr.length-1]) * 100);
// }
System.out.println(sum / arr.length);
}
}
예제 입력 1
3
40 80 60
예제 출력1
75.0
728x90
반응형