수를 처리하는 것은 통계학에서 상당히 중요한 일이다. 통계학에서 N개의 수를 대표하는 기본 통계값에는 다음과 같은 것들이 있다. 단, N은 홀수라고 가정하자.
N개의 수가 주어졌을 때, 네 가지 기본 통계값을 구하는 프로그램을 작성하시오.
첫째 줄에 수의 개수 N(1 ≤ N ≤ 500,000)이 주어진다. 단, N은 홀수이다. 그 다음 N개의 줄에는 정수들이 주어진다. 입력되는 정수의 절댓값은 4,000을 넘지 않는다.
첫째 줄에는 산술평균을 출력한다. 소수점 이하 첫째 자리에서 반올림한 값을 출력한다.
둘째 줄에는 중앙값을 출력한다.
셋째 줄에는 최빈값을 출력한다. 여러 개 있을 때에는 최빈값 중 두 번째로 작은 값을 출력한다.
넷째 줄에는 범위를 출력한다.

const fs = require("fs");
const input = fs.readFileSync("/dev/stdin").toString().trim().split('\n').map(Number);
const N = input[0];
const numbers = input.slice(1).sort((a, b) => a - b);
const sum = numbers.reduce((acc, cur) => acc + cur, 0);
const average = Math.round(sum / N) === -0 ? 0 : Math.round(sum / N);
const median = numbers[Math.floor(N / 2)];
const freqMap = new Map();
let maxFreq = 0;
numbers.forEach(num => {
const freq = (freqMap.get(num) || 0) + 1;
freqMap.set(num, freq);
if (freq > maxFreq) maxFreq = freq;
});
const freqList = [];
freqMap.forEach((value, key) => {
if (value === maxFreq) freqList.push(key);
});
freqList.sort((a, b) => a - b);
const mode = freqList.length >= 2 ? freqList[1] : freqList[0];
const range = numbers[numbers.length - 1] - numbers[0];
console.log(average);
console.log(median);
console.log(mode);
console.log(range);
const numbers = input.slice(1).sort((a, b) => a - b);
input.slice(1)으로 실제 값들만 떼어내 정렬한 뒤 numbers에 오름차순으로 저장합니다.
//평균
const sum = numbers.reduce((acc, cur) => acc + cur, 0);
const average = Math.round(sum / N) === -0 ? 0 : Math.round(sum / N);
reduce로 모든 수의 합 sum을 구하고,
sum / N을 Math.round로 반올림한 값을 average에
-0이 나올 경우(자바스크립트에서 Math.round(-0.4) 같은 결과로) 이를 0으로 바꿉니다.
//중앙값 (median)
const median = numbers[Math.floor(N / 2)];
오름차순 정렬된 numbers에서 인덱스 [N/2] 위치의 값을 중앙값으로 취합니다.
//최소값
const freqMap = new Map();
let maxFreq = 0;
numbers.forEach(num => {
const freq = (freqMap.get(num) || 0) + 1;
freqMap.set(num, freq);
if (freq > maxFreq) maxFreq = freq;
});
const freqList = [];
freqMap.forEach((value, key) => {
if (value === maxFreq) freqList.push(key);
});
freqList.sort((a, b) => a - b);
const mode = freqList.length >= 2 ? freqList[1] : freqList[0];
Map을 써서 각 숫자의 등장 횟수를 세고(freqMap), 등장 횟수 중 최댓값 maxFreq를 기록
freqMap을 순회하며, 등장 횟수가 maxFreq인 모든 키(숫자)를 freqList에 수집
이 리스트를 오름차순 정렬
여러 개의 최빈값(길이 ≥ 2)이 있으면 두 번째로 작은 값(freqList[1]), 한개면 그 값(freqList[0])을 mode에 저장
//범위
const range = numbers[numbers.length - 1] - numbers[0];
정렬된 배열의 최댓값(마지막 요소)과 최솟값(첫 요소) 차이.