99클럽 코테 스터디 5주차 보너스문제 TIL
💙 JAVA 비기너
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
import java.util.Arrays;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int N = Integer.parseInt(br.readLine());
int num[] = new int[N];
int sum = 0;
for(int i=0; i<N; i++) {
int x = Integer.parseInt(br.readLine());
num[i] = x;
sum += x;
}
br.close();
Arrays.sort(num);
// 산술평균
bw.write((int)Math.round((double)sum/num.length) + "\n");
// 중앙값
bw.write(num[num.length/2] + "\n");
// 최빈값
int RANGE = 8001;
int count[] = new int[RANGE];
int maxCnt = 0;
for(int i=0; i<num.length; i++) {
count[num[i] + 4000]++;
maxCnt = Math.max(count[num[i]+4000], maxCnt);
}
ArrayList<Integer> maxList = new ArrayList<>();
for(int i=0; i<RANGE; i++) {
if(maxCnt == count[i]) maxList.add(i-4000);
}
bw.write(((maxList.size() <= 1) ? maxList.get(0) : maxList.get(1)) + "\n");
// 범위
bw.write((num[num.length - 1] - num[0]) + "\n");
bw.flush();
bw.close();
}
}
- 산술평균 : N개의 수들의 합을 N으로 나눈 값
- 중앙값 : N개의 수들을 증가하는 순서로 나열했을 경우 그 중앙에 위치하는 값
- 최빈값 : N개의 수들 중 가장 많이 나타나는 값
- 범위 : N개의 수들 중 최댓값과 최솟값의 차이
입력받은 숫자들의 합을 숫자의 개수N
으로 나누면 된다.
N
은 홀수라는 조건이 있으므로 순서대로 정렬했을 때 가운데값을 가져오면 된다.
가장 어려웠던 녀석...
질문게시판과 블로그를 통해 알게 된 것은 카운팅 정렬을 사용하는 것이다.
입력되는 정수의 절댓값은 4,000을 넘지 않으므로 -4,000~4,000까지의 수를 가질 수 있다.
8,001개의 범위를 갖는 정수 정렬 count
를 선언한다. count
의 입력받은 수+4000을 한 인덱스에 입력받은 수의 나타난 수를 기록한다.
count
에 저장된 정수 중 가장 큰 정수를 maxCnt
에 저장한 후 maxCnt
만큼 나타났던 숫자들을 maxList
에 넣어 자동 정렬을 시켜준다.
마지막으로 maxList
의 요소가 한개 이하라면 첫번째 요소를 출력하고 여러개라면 두번째로 작은 값인 maxList.get(1)
을 출력한다.
가장 큰 값에서 가장 작은 값을 빼면 된다.