[백준 2108번: 통계학] java 풀이

Elmo·2022년 7월 26일
0

[백준] 알고리즘

목록 보기
10/42
post-custom-banner

쉽다고 생각했는데 생각보다 헤맸던 문제...

이 문제의 핵심은 최빈값 구하기다.

상대적으로 평균값, 중앙값, 범위는 구하기 매우 쉬웠다.
처음에 풀 때는 최빈값에서 정렬을 여러번 썼다. 풀면서도 너무 코드가 복잡해지고 느낌이 불길했는데 역시나 시간초과가 떴다...

그래서 선택한 방법은 카운팅 정렬이다.

최빈값의 핵심은 해당 숫자가 몇 번이나 중복됐는지 횟수를 세는 것인데 여기에 카운팅 정렬이 가장 적절하다고 봤다.

🔑 java 풀이

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {


	public static void main(String[] args) throws IOException{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		int N = Integer.parseInt(br.readLine());
		int num[]=new int[N];
		for(int i=0; i<N; i++)
			num[i]=Integer.parseInt(br.readLine());

		//평균값 구하기
		int sum=0;
		for(int i=0; i<N; i++) {
			sum+=num[i];
		}
		System.out.println(Math.round(sum/(float)N));
			
		//CountingSort
		int count[]=new int[8001];
		
		for(int i=0; i<N; i++) 
			count[num[i]+4000]++;
		int value[]=count.clone();
		for(int i=1; i<8001; i++)
			count[i]=count[i]+count[i-1];
		
		int result[]= new int[N];
		for(int i=N-1; i>=0; i--) {
			int temp=count[num[i]+4000]-1;
			result[temp]=num[i];
			count[num[i]+4000]=temp;
		}
		//중앙값
		System.out.println(result[N/2]);
		//최빈값
		int max=0;
		int cnt=0,mode=0;
		for(int i=0; i<8001; i++) {
			if(max<value[i])
				max=value[i];
		}
		for(int i=0; i<8001; i++) {
			if(max==value[i]) {
				cnt++;
				mode=i-4000;
			}
			if(cnt==2)
				break;
		}
		System.out.println(mode);
		//범위
		System.out.println(result[N-1]-result[0]);
		
	}

}

간단한 문제도 헤매는 나를 보면 현타가 온다..

profile
엘모는 즐거워
post-custom-banner

0개의 댓글