알고리즘/BOJ
[BOJ] 2108. 통계학
재담
2022. 2. 20. 01:37
문제 원본 : https://www.acmicpc.net/problem/2108
2108번: 통계학
첫째 줄에 수의 개수 N(1 ≤ N ≤ 500,000)이 주어진다. 단, N은 홀수이다. 그 다음 N개의 줄에는 정수들이 주어진다. 입력되는 정수의 절댓값은 4,000을 넘지 않는다.
www.acmicpc.net
import java.util.ArrayList;
import java.util.Collections;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
ArrayList<Integer> list = new ArrayList<>();
for (int i = 0; i < n; ++i) {
int num = scanner.nextInt();
list.add(num);
}
list.add(99999);
Collections.sort(list);
int sum = list.get(0);
int bin = list.get(0);
int max = 0, cnt = 1;
boolean flag = false;
for (int i = 1; i < n + 1; ++i) {
sum += list.get(i);
if (list.get(i).equals(list.get(i - 1))) {
++cnt;
} else {
if (cnt > max) {
max = cnt;
flag = false;
bin = list.get(i - 1);
} else if (cnt == max && !flag) {
flag = true;
bin = list.get(i - 1);
}
cnt = 1;
}
}
sum -= 99999;
System.out.println(Math.round( sum / (double) n));
System.out.println(list.get(n / 2));
System.out.println(bin);
System.out.println(list.get(n - 1) - list.get(0));
}
}
- 실버 4라고 만만하게 봤다가 큰코다쳤다...
- 99999를 넣은 것은 최빈값을 구할 때 for 문 끝나고 한 번 더 체크하지 않기 위해서 일부러 넣었다.
- cnt를 초기화하는 부분은 else 문에서 무조건 해줘야 하는데,
- else 문 안에서 if 문과 else if 문에서만 해줘서 모든 경우를 커버하지 못했다.
- 반례 찾는데 1시간 넘게 걸린 것 같다.
- 질문하기 게시판에서 1페이지부터 모든 게시물에 있는 반례를 시도하다가 거의 10페이지쯤 가서 찾았다.
- 반례 찾아준 분한테 너무 고맙다.
- 8001칸의 배열을 만들어서 하는 방식에 비해 효율은 그다지 안 좋은 것 같다...