Post

[백준] 2108번_통계학(Java)

문제 풀이

백준의 2108번 문제입니다. 문제 출처

(1) 문제 파악

q1

문제에서 알려준 그대로 연산 결과를 출력하면 되는 문제입니다.

(2) 문제 풀이 방법 생각하기

이 문제에서의 포인트는 최빈값 입니다!

숫자 값의 범위는 -4000에서 4000까지로 범위가 작으므로 각각을 인덱스로 사용하는 배열을 만들어 값의 숫자를 카운팅하였습니다.

(3) 시간 복잡도 확인

문제의 시간 제한은 2초이며 대략 2억번의 연산까지는 가능합니다.

  • 처음 입력을 받아 배열에 저장하는 연산 N번
  • 최빈값의 개수를 찾아내는 연산 4001 + 4001
  • 최빈값 찾는 연산 N번

N의 범위는 최대 500,000이기 때문에 충분히 가능한 연산입니다.

(4) 구현

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
import java.io.*;
import java.util.*;

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 mode = 0; // 최빈값

		int[] arr = new int[N];
		int[] positive_arr = new int[4001];
		int[] negative_arr = new int[4001];

		double sum = 0;

		for(int i=0; i<N; i++) {
			int temp = Integer.parseInt(br.readLine());
			
			// 평균 계산을 위한 총합 계산
			sum += temp;
			
			// 중앙값 및 범위를 위한 배열에 삽입
			arr[i] = temp;

			// 최빈값을 구하기 위함
			if(temp>=0) positive_arr[temp]++;
			else negative_arr[Math.abs(temp)]++;
        }

		// 정렬
		Arrays.sort(arr);

        int max = 0;
        for(int i=0; i<positive_arr.length; i++) {
            max = Math.max(max, positive_arr[i]);
        }
        for(int i=0; i<negative_arr.length; i++) {
            max = Math.max(max, negative_arr[i]);
        }

        List<Integer> list = new ArrayList<>();
        for(int number: arr) {
            if(number<0) {
                if(negative_arr[Math.abs(number)] == max && !(list.contains(number))) list.add(number);
            } else {
                if(positive_arr[number] == max && !(list.contains(number))) list.add(number);
            }
        }

        if(list.size() >= 2) mode = list.get(1);
        else mode = list.get(0);

        System.out.println(Math.round(sum/N));
        System.out.println(arr[N/2]);
        System.out.println(mode);
        System.out.println(arr[N-1]-arr[0]);
	}
}

(5) 결과 확인

q_result

This post is licensed under CC BY 4.0 by the author.

Comments