땀두 블로그

[백준] 2108번 - 통계학 본문

알고리즘/백준

[백준] 2108번 - 통계학

땀두 2022. 3. 20. 11:55

 

이 문제는 간단한 수학 문제이다. 입력값의 개수는 홀수라고 정해졌기 때문에 중간값은 입력값을 2로 나눈 값을 해주면 되고, 산술평균의 경우 모든 값을 다 더한 뒤 입력값의 개수로 나누어주면된다.

최빈값의 경우 조금 헷갈렸는데, 범위가 절대값 4000으로 주어졌기 때문에 8001짜리 배열을 만들어 빈도 수를 저장하고, 최대값과 최소값을 지정하여 그 부분만 반복하여 빈도수가 가장 높은 값을 구한다. 그리고 flag를 두어 한번 방문하고 같은 최빈값을 가지는 경우 갱신할 수 있도록 하였다.

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

public class p2108 {

	public static void main(String[] args) throws IOException {
		// TODO Auto-generated method stub
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringBuilder sb = new StringBuilder();

		int[] index = new int[8001];
		int a = Integer.parseInt(br.readLine());
		ArrayList<Integer> list = new ArrayList<>();

		int min = 4000;
		int max = -4000;
		double sum = 0;

		for (int i = 0; i < a; i++) {
			list.add(Integer.parseInt(br.readLine()));
			sum += list.get(i);
			index[list.get(i) + 4000]++;
			if (list.get(i) < min) {
				min = list.get(i);
			}
			if (list.get(i) > max) {
				max = list.get(i);
			}
		}
		Collections.sort(list);
		int cnt = 0;// 최빈값 수
		int idx = 0;
		boolean flag = false;

		for (int i = min + 4000; i <= max + 4000; i++) {
			if (cnt < index[i]) {
				cnt = index[i];
				idx = i - 4000;
				flag = true;
			} else if (cnt == index[i] && flag == true) {
				cnt = index[i];
				idx = i - 4000;
				flag = false;
			}
		}
		
		sb.append(Math.round(sum / a) + "\n");
		sb.append(list.get(a / 2) + "\n");
		sb.append(idx + "\n");
		sb.append(list.get(a - 1) - list.get(0));

		System.out.println(sb);
	}
}
 

 

 

'알고리즘 > 백준' 카테고리의 다른 글

[백준] 9012번 - 괄호  (0) 2022.03.20
[백준] 1920번 - 수 찾기(HashSet)  (0) 2022.03.20
[백준] 1920번 - 수 찾기  (0) 2022.03.20
[백준] 11651번 - 좌표 정렬하기 2  (0) 2022.03.19
[백준] 11650번 - 좌표 정렬하기  (0) 2022.03.19
Comments