개발자일걸요..?

2108번 통계학 본문

알고리즘코딩/Baekjoon Online Judge

2108번 통계학

Re_A 2021. 2. 3. 21:44
728x90
반응형

문제링크 : www.acmicpc.net/problem/2108

 

2108번: 통계학

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

www.acmicpc.net

개인적 tip

 1) 입력을 받을때 각 숫자가 몇번 들어오는지 세는게 좋다.

 2) 입력 받는 수 가운데 가장 작은 값과 큰 값은 알아두는게 좋다(for문을 많이 쓰는데 그때 범위를 최소화하기 위해)

 

import java.util.Scanner;
import java.util.Arrays;
public class Main {
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner scan = new Scanner(System.in);
		
		//입력받기
		int T= scan.nextInt();
		int[] list = new int[T];
		int[] index = new int[8002];
		for(int i =0;i<T;i++) {
			list[i] = scan.nextInt();
			index[list[i]+4000]++;
		}
		
		int max = -4001;
		int min = 4001;
		int sum =0;
		for(int i =0;i<T;i++) {
			sum += list[i];
			if(list[i] >= max) {
				max = list[i];
			}
			if(list[i]<=min) {
				min = list[i];
			}
		}
		//평균
		double mean = Math.round((double)sum/(double)T);
		//범위
		int range = max-min;
		//중간값
		int median = 0;
		long medianInd = Math.round((double)T/(double)2);
		int now = 0;
		for(int i =min+4000;i<max+4001;i++) {
			now = now + index[i];
			if(now >= medianInd) {
				median = i-4000;
				break;
			}
		}
		//최빈값
		int mode = 0;
		int modeCount = 0;
		boolean flag = false;
		for(int i =min+4000;i<max+4001;i++) {
			if(modeCount<index[i]) {
				modeCount = index[i];
				mode = i-4000;
				flag =true;
			}
			else if(index[i] == modeCount && flag==true) {
				mode = i-4000;
				flag = false;
			}
		}
		
		System.out.println((int)mean);
		System.out.println(median);
		System.out.println(mode);
		System.out.println(range);
	}
}
반응형

'알고리즘코딩 > Baekjoon Online Judge' 카테고리의 다른 글

1427번 소트인사이드  (0) 2021.02.04
2751번 수 정렬하기 2  (0) 2021.02.04
10989번 수 정렬하기 3  (0) 2021.02.03
2750번 수 정렬하기  (0) 2021.02.02
1018번 체스판 다시 칠하기  (0) 2021.02.02
Comments