알고리즘 문제풀이/백준

#2108 : 통계학

모항 2022. 4. 28. 21:44

풀이방법

사용된 것:

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