본문 바로가기
백준알고리즘

백준알고리즘:p2108 통계학

by socialcomputer 2021. 3. 20.

분류: 정렬

 

문제

 

코드

//백준알고리즘 제출시 클래스 이름은 Main으로 바꿔야 됨 
package sort;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
//해결은 했지만 런타임 에러
public class p2108_2 {

	public static void main(String[] args) {
		try(	BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
				BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));){
			int n = Integer.parseInt(br.readLine());
			int[] cnt = new int[8001]; //-4000~4000까지: 인덱스 0~3999은 음수, 4000은 0, 4001~8000은 양수
			int sum = 0; int first=0, last=0; int center=0;
			for(int i=0; i<n; i++) {
				int number = Integer.parseInt(br.readLine());
				cnt[number+4000] +=1;
				sum += number;
			}
			int total=0;int index=0;
			boolean flag =false; int mode=0; int mode_max=0;
			/*flag는 빈도수가 같은게 나왔는지 체크하는거. mode는 최빈값, mode_max는 빈도수*/
			for(int i=0; i<=8000; i++) {
				if(cnt[i]>0) {
					if(cnt[i]>mode_max) {//가장 많이나온 횟수가 같으면 2번쨰로 작은 값(=즉 오름차순에서 두번째)을 최빈값으로 정한다.
						mode_max = cnt[i];
						mode = i-4000;
						flag = true;
					}else if(flag==true && mode_max==cnt[i]){//위 주석 때문에 같은 횟수가 두번째 이후에 나오는건 필요없기에 
						mode_max = cnt[i];
						mode = i-4000;
						flag = false;						//flag를 false로 해주고 더 큰 수를 찾게 한다.
					}
					
					if(index==0) first=i-4000;
					else if(index>0) last=i-4000;
					if(total<(n+1)/2 ) { //중간값을 구하는 법:total이 (n+1)/2번쨰 수가 될때까지 돌리면 그때i-4000가 중간값이 됨.
						center = i-4000;				//(like)3번째 수를 구하는데 3이상이 될때의 수를 구한거...//?
					}total += cnt[i];
					index++;
					if(total>n) break;
				}
			}
			
			bw.write(String.valueOf(Math.round(sum/n))+"\n"//평균
					+String.valueOf(mode)+"\n"//최빈값
					+String.valueOf(center)+"\n"//중간값
					+String.valueOf(last-first)+"\n"//최댓값과 최솟값의 차이
					);
			bw.flush();
	}catch(Exception e) {e.printStackTrace();}
	}
}

▶flag를 사용해서 최빈값을 구했다.

 

 

참고한 블로그: st-lab.tistory.com/108

다시 해봐야 하나. 왜 런타임에러가 자꾸 나오지ㅠ


채점결과

ㅋㅋㅋㅋㅋ광기..

 

링크 www.acmicpc.net/problem/2108

 

2108번: 통계학

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

www.acmicpc.net

 

댓글