쉽다고 생각했는데 생각보다 헤맸던 문제...
상대적으로 평균값, 중앙값, 범위는 구하기 매우 쉬웠다.
처음에 풀 때는 최빈값에서 정렬을 여러번 썼다. 풀면서도 너무 코드가 복잡해지고 느낌이 불길했는데 역시나 시간초과가 떴다...
그래서 선택한 방법은 카운팅 정렬이다.
최빈값의 핵심은 해당 숫자가 몇 번이나 중복됐는지 횟수를 세는 것인데 여기에 카운팅 정렬이 가장 적절하다고 봤다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
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 num[]=new int[N];
for(int i=0; i<N; i++)
num[i]=Integer.parseInt(br.readLine());
//평균값 구하기
int sum=0;
for(int i=0; i<N; i++) {
sum+=num[i];
}
System.out.println(Math.round(sum/(float)N));
//CountingSort
int count[]=new int[8001];
for(int i=0; i<N; i++)
count[num[i]+4000]++;
int value[]=count.clone();
for(int i=1; i<8001; i++)
count[i]=count[i]+count[i-1];
int result[]= new int[N];
for(int i=N-1; i>=0; i--) {
int temp=count[num[i]+4000]-1;
result[temp]=num[i];
count[num[i]+4000]=temp;
}
//중앙값
System.out.println(result[N/2]);
//최빈값
int max=0;
int cnt=0,mode=0;
for(int i=0; i<8001; i++) {
if(max<value[i])
max=value[i];
}
for(int i=0; i<8001; i++) {
if(max==value[i]) {
cnt++;
mode=i-4000;
}
if(cnt==2)
break;
}
System.out.println(mode);
//범위
System.out.println(result[N-1]-result[0]);
}
}
간단한 문제도 헤매는 나를 보면 현타가 온다..