https://www.acmicpc.net/problem/2108
문제
- 첫째 줄에 수의 개수 N ( 1 <= N <= 500000, N % 2 == 1 ) 이 입력된다.
- 둘째 줄부터 N개의 줄에 정수들이 주어진다. ( Math.abs( 입력되는 정수 ) <= 4000 )
- 첫째 줄에는 산술평균을 출력한다. 소수점 이하 첫째 자리에서 반올림한 값을 출력한다.
- 둘째 줄에는 중앙값을 출력한다.셋째 줄에는 최빈값을 출력한다.
- 여러 개 있을 때에는 최빈값 중 두 번째로 작은 값을 출력한다.
- 넷째 줄에는 범위를 출력한다.
정답 코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
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[] list = new int[N];
HashMap<Integer, Integer> map = new HashMap<>();
double sum = 0;
for (int i = 0; i < N; i++) {
list[i] = Integer.parseInt(br.readLine());
map.put(list[i], map.getOrDefault(list[i], 0) + 1);
sum += list[i];
}
Arrays.sort(list);
if (N == 1) {
String result = list[0] + "\n" + // 산술 평균
list[0] + "\n" + // 중앙값
list[0] + "\n" + // 최빈값
0; // 범위
System.out.println(result);
return;
}
StringBuilder sb = new StringBuilder();
sb.append(Math.round(sum / N)).append("\n"); // 산술 평균
sb.append(list[N / 2]).append("\n"); // 중앙값
List<Integer> temp = new ArrayList<>(map.values());
Collections.sort(temp);
ArrayList<Integer> result = new ArrayList<>();
for (int key : map.keySet()) {
if (Objects.equals(map.get(key), temp.get(temp.size() - 1))) {
result.add(key);
}
}
Collections.sort(result);
if (result.size() <= 1) {
sb.append(result.get(0)).append("\n"); // 최빈값
} else {
sb.append(result.get(1)).append("\n"); // 최빈값
}
sb.append(list[N - 1] - list[0]); // 범위
System.out.println(sb);
}
}
다른 건 다 쉬운데 최빈값을 구하는 게 어려운 것 같다.
다른 건 조건만 잘 지켜주면 된다.
'백준 문제 풀이 > 백준 (JAVA)' 카테고리의 다른 글
JAVA 백준 20920 영단어 암기는 괴로워 (문자열, 정렬, 맵) (0) | 2025.05.11 |
---|---|
JAVA 백준 10431 줄세우기 (정렬) (0) | 2025.05.10 |
JAVA 백준 2346 풍선 터뜨리기 (큐) (0) | 2025.05.09 |
JAVA 백준 14425 문자열 집합 (집합과 맵) (0) | 2025.05.07 |
JAVA 백준 11478 서로 다른 부분 문자열의 개수 (집합과 맵) (0) | 2025.05.06 |