반응형
🔺 문제
2108번: 통계학
첫째 줄에 수의 개수 N(1 ≤ N ≤ 500,000)이 주어진다. 단, N은 홀수이다. 그 다음 N개의 줄에는 정수들이 주어진다. 입력되는 정수의 절댓값은 4,000을 넘지 않는다.
www.acmicpc.net
🔺 코드
import java.util.*;
import java.io.*;
public class Main {
public static void main(String[] args) throws IOException {
var br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
int[] list = new int[n];
for(int i=0 ; i < n ; i++) {
list[i] = Integer.parseInt(br.readLine());
}
Arrays.sort(list);
// 산술평균
double sum = 0;
for(int i : list) {
sum += i;
}
System.out.println((int)Math.round(sum / n));
// 중앙값
int mid = list[list.length/2];
System.out.println(mid);
// 최빈값 - 카운팅 정렬
int[] cnt = new int[8001];
int max = 0;
for(int i=0 ; i < list.length ; i++) {
cnt[list[i] + 4000]++;
max = Math.max(cnt[list[i] + 4000], max);
}
ArrayList<Integer> max_idx = new ArrayList<>();
for(int i=0 ; i <= 8000 ; i++) {
if(max == cnt[i])
max_idx.add(i-4000);
}
int freq = (max_idx.size() > 1) ? max_idx.get(1) : max_idx.get(0);
System.out.println(freq);
// 범위
int range = list[n-1] - list[0];
System.out.println(range);
}
}
✅ 해결 아이디어
- 값 받자마자 바로 오름차순 정렬
- 산술평균 : 합계 구할 때 double형으로 받기. 그리고 나중에 int형으로 형 변환.
- 최빈값 구하기 : 카운팅 정렬 사용
최빈값 구하는 게 어려웠다..
내가 놓쳤던 부분은 카운팅 정렬 사용하고, 최대값 구하는 리스트(max_idx) 만드는 거!
- 리스트의 원소가 최빈값(max)과 같으면 max_idx 리스트에 값 추가하기. (38-41번째 줄)
- 이 리스트의 값이 2개 이상이면 최빈값이 여러개라는 의미니까 최빈값 중 두 번째로 작은 값(=max_idx 리스트의 1번째 원소)를 리턴하고,
- 그게 아니면 최빈값이 1개라는 의미니까 최빈값 1개(=max_idx의 0번째 원소) 리턴. (42번째 줄)
🔺 다른 풀이들
[Java] 백준 2108번 [통계학] 자바
[Java] 백준 2108번 [통계학] 자바
velog.io
HashMap을 사용하셨다!
(참고)
산술평균... 최빈값 구할 때 도움을 받았씁니다.... 감사합니다...
[JAVA / 자바] 백준 2108번 - 통계학
문제 수를 처리하는 것은 통계학에서 상당히 중요한 일이다. 통계학에서 N개의 수를 대표하는 기본 통계 값에는 다음과 같은 것들이 있다. 단, N은 홀수라고 가정하자. 산술평균 : N개의 수들의
kwin0825.tistory.com
반응형
'코테 > 백준' 카테고리의 다른 글
[백준/JAVA] 11650번: 좌표 정렬하기 (0) | 2023.03.21 |
---|---|
[백준/JAVA] 10989번: 수 정렬하기 3 (0) | 2023.03.21 |
[백준/JAVA] 2751번: 수 정렬하기 2 (0) | 2023.03.17 |
[백준/JAVA] 10807번: 개수 세기 (0) | 2023.03.17 |
[백준/JAVA] 1427번: 소트인사이드 (0) | 2023.03.17 |