https://www.acmicpc.net/problem/2108
2108번: 통계학
첫째 줄에 수의 개수 N(1 ≤ N ≤ 500,000)이 주어진다. 단, N은 홀수이다. 그 다음 N개의 줄에는 정수들이 주어진다. 입력되는 정수의 절댓값은 4,000을 넘지 않는다.
www.acmicpc.net
백준 2108번 통계학 문제 링크입니다.
핵심
여러 가지 수를 받은 다음에 평균, 중앙값, 최빈값, 범위를 구하는 것이다. 최빈값을 구하는 것이 이 문제에서 가장 핵심이다.
정답 코드
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int N =sc.nextInt();
int[] number = new int[N];
double sum=0;
for(int i =0; i<N; i++) {
number[i]=sc.nextInt();
sum+=number[i];
}
Arrays.sort(number);
//최빈값
int[] arr= new int[8001];
for(int i=0; i <N;i++) {
if(number[i]<0)arr[number[i]*(-1)+4000]++;
else arr[number[i]]++;
}
int count=0;
for(int i=0;i<arr.length; i++) {
if(count<arr[i])count=arr[i];
}
int same=0;
ArrayList<Integer> list = new ArrayList<>();
for(int i=0;i<arr.length; i++) {
if(count==arr[i]) {
same++;
if(i<4001)list.add(i);
else if(i>=4001)list.add((-1)*i+4000);
}
}
Collections.sort(list);
System.out.println(Math.round(sum/N));
System.out.println(number[N/2]);
//최빈값
if(same==1)System.out.println(list.get(0));
else if(same>1)System.out.println(list.get(1));
System.out.println(number[N-1]-number[0]);
}
}
해설
이 문제의 핵심은 최빈값을 구하는 것이다. N만큼 수를 읽어 들이고, 그 수를 배열 number에 넣는다.
넣는 동시에 총 합을 구하는데, 이는 평균을 내기 위함이다. 이후 배열을 sort를 통해 정열 시킨다.
그다음 arr 배열을 만드는데, 받는 수가 -4000~4000이므로 8001 크기의 배열을 만든다.
그 후 수가 0~4000이면 배열 0부터 4000에 넣고, -1~-4000은 4001부터 8000까지 넣게 된다.
카운트는 가장 많이 나온 횟수를 체크하기 위함이다.
이후 same 변수를 선언하였는데, 이는 중복된 최빈수가 있는지 체크하기 위함이다.
카운트와 배열의 횟수가 일치하면 -> 최빈수이면, 자리수의 위치를 list에 추가한다.
이때 4001~8000은 음수의 값이므로 -1*i+4000을 해준다.
다시 list를 정열해준다.
이제 평균, 중앙값, 최빈값, 범위 순으로 출력한다.
Math.round는 소수점 첫 번째 자리에서 반올림을 해준다.
최빈값 출력에서 same ==1 은 최빈값이 1가지만 나왔음을 의미하므로 가장 작은 값인 list.get(0);를 사용하고, same이 1보다 클 경우 최빈값이 2가지 이상이므로 두 번째로 작은 값인 lsit.get(1);를 사용한다.
개선점이나 오류가 있다면 댓글부탁드립니다.
'PS > 알고리즘 문제풀이' 카테고리의 다른 글
[백준]1181번 단어정렬(java) (0) | 2022.07.06 |
---|---|
[백준]2798번 블랙잭(java) (0) | 2022.07.04 |
[백준]2581번 소수(java) (0) | 2022.07.04 |
[백준]2838번 설탕 배달(java) (2) | 2022.07.04 |
[백준]10757번 큰수A+B(java) (0) | 2022.07.04 |