https://www.acmicpc.net/problem/2108
백준 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 |