본문 바로가기
Preparing Coding Test/Baekjoon

[Java/백준/정렬] 2108 - 통계학

by weero 2020. 8. 24.

문제

https://www.acmicpc.net/problem/2108

 

2108번: 통계학

첫째 줄에 수의 개수 N(1 ≤ N ≤ 500,000)이 주어진다. 그 다음 N개의 줄에는 정수들이 주어진다. 입력되는 정수의 절댓값은 4,000을 넘지 않는다.

www.acmicpc.net

 

코드 (틀렸습니다)

예제 테스트케이스는 통과한다.

(아마 산술 평균에서 틀린거 같다. 이런 방법이 아니라 반올림을 사용했어야 했다)

 

최빈값은 -4000~4000 까지 담을 수 있는 int 형 배열을 선언한 뒤 숫자+4000 인덱스에 빈도수를 더하도록 했다.

아래 코드의 arr 배열과 처음 for문을 참고하면 된다.

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Collections;

public class Main{
	public static void main(String[] args) throws IOException{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringBuilder sb = new StringBuilder();
		
		int N = Integer.parseInt(br.readLine());
		ArrayList<Integer> tmpList = new ArrayList<>();
		int[] arr = new int[8001];
		for(int i=0; i<N; i++) {
			int tmp = Integer.parseInt(br.readLine());
			tmpList.add(tmp);
			arr[tmp+4000]++;
		}
		Collections.sort(tmpList);
		
		int sum4avg = 0;
		int median = 0;
		int idx=0;
		int min=0, max=0;
		for(int data : tmpList) {
			if(idx==0)
				min=data;
			if(idx==tmpList.size()-1)
				max=data;
			
			sum4avg += data;
			
			//중앙값
			if(idx==N/2) { 
				median = data;
			}	
			
			idx++;
		}
		
		//산술평균
		int avg = sum4avg/N;
		if(avg<0 && sum4avg%N!=0)
			avg--;
		
		//범위
		int range = max-min;
		
		//최빈값
		int mode = 0;
		int cnt = 0;
		for(int i=0; i<8001; i++) {
			if(arr[i]>cnt) {
				cnt=arr[i];
			}
		}
		
		int maxCnt = 0;
		for(int i=0; i<8001; i++) {
			if(arr[i]==cnt && maxCnt==0 ) {
				mode=i;
				maxCnt++;
			}else if(arr[i]==cnt && maxCnt==1) {
				mode=i;
				break;
			}
		}
		mode-=4000;
		
		sb.append(avg).append("\n");
		sb.append(median).append("\n");
		sb.append(mode).append("\n");
		sb.append(range).append("\n");
		
		System.out.println(sb);
	}
}

 

새로운 코드

list의 get을 사용하면 범위도, 중앙값도 쉽게 나온다

평균반올림 내장함수를 사용했다.

최빈값은 -4000~4000 까지 담을 수 있는 int 형 배열을 선언한 뒤 숫자+4000 인덱스에 빈도수를 더하도록 했다.

아래 코드의 arr 배열과 처음 for문을 참고하면 된다.

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Collections;

public class Main{
	public static void main(String[] args) throws IOException{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringBuilder sb = new StringBuilder();
		
		int N = Integer.parseInt(br.readLine());
		ArrayList<Integer> list = new ArrayList<>();
		int[] arr = new int[8001];
		for(int i=0; i<N; i++) {
			int tmp = Integer.parseInt(br.readLine());
			list.add(tmp);
			arr[tmp+4000]++;
		}
		Collections.sort(list);
		
		//중앙값
		int median = list.get(N/2);
		
		//산술평균
		int sum4avg = 0;
		for(int data : list) {
			sum4avg += data;
		}
		
		int avg = (int) Math.round((double)sum4avg/N);
		
		//범위
		int range = list.get(list.size()-1)-list.get(0);
		
		//최빈값
		int mode = 0;
		int cnt = 0;
		for(int i=0; i<8001; i++) {
			if(arr[i]>cnt) {
				cnt=arr[i];
			}
		}
		
		int maxCnt = 0;
		for(int i=0; i<8001; i++) {
			if(arr[i]==cnt && maxCnt==0 ) {
				mode=i;
				maxCnt++;
			}else if(arr[i]==cnt && maxCnt==1) {
				mode=i;
				break;
			}
		}
		mode-=4000;
		
		sb.append(avg).append("\n");
		sb.append(median).append("\n");
		sb.append(mode).append("\n");
		sb.append(range).append("\n");
		
		System.out.println(sb);
	}
}

아이고 속 시원하다.