수를 처리하는 것은 통계학에서 상당히 중요한 일이다. 통계학에서 N
개의 수를 대표하는 기본 통계값에는 다음과 같은 것들이 있다. 단, N
은 홀수라고 가정하자.
N
개의 수들의 합을 N
으로 나눈 값N
개의 수들을 증가하는 순서로 나열했을 경우 그 중앙에 위치하는 값N
개의 수들 중 가장 많이 나타나는 값N
개의 수들 중 최댓값과 최솟값의 차이N
개의 수가 주어졌을 때, 네 가지 기본 통계값을 구하는 프로그램을 작성하시오.
첫째 줄에 수의 개수 N(1 ≤ N ≤ 500,000)
이 주어진다. 단, N
은 홀수이다. 그 다음 N
개의 줄에는 정수들이 주어진다. 입력되는 정수의 절댓값은 4,000을 넘지 않는다.
첫째 줄에는 산술평균을 출력한다. 소수점 이하 첫째 자리에서 반올림한 값을 출력한다.
둘째 줄에는 중앙값을 출력한다.
셋째 줄에는 최빈값을 출력한다. 여러 개 있을 때에는 최빈값 중 두 번째로 작은 값을 출력한다.
넷째 줄에는 범위를 출력한다.
5
1
3
8
-2
2
2
2
1
10
1
4000
4000
4000
4000
0
5
-1
-2
-3
-1
-2
-2
-2
-1
2
3
0
0
-1
0
0
0
1
(0 + 0 + (-1)) / 3 = -0.333333... 이고 이를 첫째 자리에서 반올림하면 0이다. -0으로 출력하면 안된다.
-데이터를 추가한 사람: bjh3502, bsyun0571, djm03178, jungyh1509, kongum, palilo, YunGoon
-문제의 오타를 찾은 사람: jh05013, skynet
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.util.*;
public class Code2108 {
public static void main(String[] args) throws IOException {
Scanner sc=new Scanner(System.in);
int N=sc.nextInt();
HashMap<Integer,Integer> map =new HashMap<>();
int sum=0;
int[] num=new int[N];
for(int i=0;i<N;i++){
num[i]=sc.nextInt();
sum+=num[i];
map.put(num[i],0);//최빈값 탐색을 위함
}
for(int i=0;i<N;i++){
map.put(num[i],map.get(num[i])+1);
}
int max=0;
for(int i=0;i<N;i++){
if(max<map.get(num[i])){//값이 max보다 크면
max=map.get(num[i]);
}
}
HashSet<Integer> maxs=new HashSet<>();
int count=0;
for(int i=0;i<N;i++){
if(max==map.get(num[i])){
maxs.add(num[i]); //3이 3번 들어가도 3 하나만 있음
}
}
BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(System.out));
double first=(double)sum/(double)N;
int t=0;
if(first<0){
if(Math.abs(first)-Math.abs((int)first)>=0.5){
t=(int)first-1;
}
else{
t=(int)first;
}
}
else{
t= (int) Math.round(first);
}
bw.write(String.valueOf(t)+"\n"); //산술평균
Arrays.sort(num);
bw.write(String.valueOf(num[N/2])+"\n");
ArrayList<Integer> so=new ArrayList<>(maxs);
Collections.sort(so);
if(so.size()>=2){
bw.write(String.valueOf(so.get(1))+"\n");
}
else{
bw.write(String .valueOf(so.get(0))+"\n");
}
int n=num[num.length-1]-num[0];
bw.write(String.valueOf(n));
bw.flush();
bw.close();
}
}
자바의 round
함수 때문에 얘들이 -3.5
를 -3
으로 반올림 해서 (원래는 -4
) 그거에 대한 조건을 추가하느라 좀 헤맸다.
최빈값은 HashSet
을 이용했고, ArrayList
에 저장해서 추출했다.