풀이방법
사용된 것:
HashMap
TreeSet
2022.04.28
평균, 중앙값, 범위는 매우 쉽게 구할 수 있으나 최빈값을 구하기가 성가신 문제였다.
최빈값을 구하는 데에만 해시맵과 트리셋을 다 사용했다... 더 간단하게 구하는 방법이 있을 것 같은데 뭔가 찝찝하다.
평균은 총합을 구한 뒤 이를 n으로 나누면 된다.
그리고 입력된 수들을 모두 저장한 int[]형 배열을 오름차순으로 정렬한다.(Arrays.sort() 사용)
정렬된 배열에서 인덱스가 n/2인 수가 중앙값이다.
정렬된 배열의 마지막 수에서 첫 번째 수를 뺀 것이 범위이다.
최빈값을 구한 방법은 다음과 같다.
먼저 해시맵을 사용해 모든 수의 등장 횟수를 구한다.
<수, 등장 횟수>를 저장하는 <Integer, Integer>형 해시맵을 사용하면 된다.
그 다음 위의 해시맵을 처음부터 돌면서 등장 횟수의 최댓값을 구한다.
그리고 <Integer>형 트리셋을 사용한다.
해시맵을 처음부터 돌면서, 등장 횟수의 최댓값과 value가 동일한 수, 즉 최빈값인 수를 모두 트리셋에 넣는다.
이렇게 만들어진 트리셋의 사이즈가 1이면 최빈값이 한 개인 것이므로 first()를 통해 출력하면 된다.
트리셋의 사이즈가 1보다 크다면 pollFirst()로 처음 값을 하나 없애고 first()를 통해 둘째 값을 출력하면 된다. 트리셋은 자동으로 요소들을 오름차순 정렬하기 때문에 이렇게 앞에서 두 번째인 수를 출력하면 두 번째로 작은 수를 출력할 수 있다.
코드
Java(2022.04.28)
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.HashMap;
import java.util.TreeSet;
public class Main {
public static void main(String[] args) throws IOException{
// TODO Auto-generated method stub
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
int[] arr = new int[n];
int sum = 0; //평균을 구하기 위해 입력과 동시에 총 합계 구해두기
for(int i = 0; i<n; i++) {
arr[i] = Integer.parseInt(br.readLine());
sum += arr[i];
}
//중앙값과 범위를 구하기 위해 정렬
Arrays.sort(arr);
//여기까지 평균, 중앙값, 범위를 구하기 위한 준비는 완료
//이 아래는 최빈값을 구하는 과정
//<수, 수 개수>를 저장하는 해시맵
HashMap<Integer, Integer> hm = new HashMap<Integer, Integer>();
//각 수마다의 개수 세기
for(int i : arr) {
if(hm.containsKey(i))hm.put(i, hm.get(i)+1);
else hm.put(i, 1);
}
//개수 중 최댓값 구하기
int max_cnt = 0;
for(int i : hm.values()) {
max_cnt = Math.max(max_cnt, i);
}
//최빈값에 해당하는 수들을 모두 트리셋에 넣기
TreeSet<Integer> ts = new TreeSet<Integer>();
for(int i : hm.keySet()) {
if(hm.get(i) == max_cnt)ts.add(i);
}
//정답 출력
System.out.println(Math.round((double)sum/n));
System.out.println(arr[n/2]);
if(ts.size()>1) ts.pollFirst();
System.out.println(ts.first());
System.out.println(arr[n-1] - arr[0]);
}
}
'알고리즘 문제풀이 > 백준' 카테고리의 다른 글
#4949 : 균형잡힌 세상 (0) | 2022.04.29 |
---|---|
#1449 : 수리공 항승 (0) | 2022.04.28 |
#2292 : 벌집 (0) | 2022.04.23 |
#1018 : 체스판 다시 칠하기 (0) | 2022.04.21 |
#11866 : 요세푸스 문제 0 (0) | 2022.04.21 |