알고리즘
[백준 2108번] 통계학 - JavaScript
미누라니까요
2025. 2. 5. 10:49
728x90
반응형
SMALL
이 문제는 숫자들을 받아 산술평균, 중앙값, 최빈값, 범위를 출력하는 구현 문제이다.
이 문제에서 발생할 수 있는 문제점으로는 -0이 출력되는 경우이다. 그 외에는 모두 수학 개념적인 부분을 구현하면 된다.
나는 이 문제에서 -0이 발생할 때 이를 해결하기 위해 fixNagativeZero라는 함수를 따로 구현하여 사용하였다.
const fixNegativeZero = (num) => (Object.is(num, -0) ? 0 : num);
또한 최빈값을 찾는 문제에서, 배열의 각 요소들에 대해 Map을 사용하여 더 효율적으로 최빈값을 구하도록 하였다.
// 최빈값
const freqMap = new Map();
let maxFreq = 0;
let mostFrequent = [];
for (let num of arr) {
freqMap.set(num, (freqMap.get(num) || 0) + 1);
maxFreq = Math.max(maxFreq, freqMap.get(num));
}
for (let [key, value] of freqMap) {
if (value === maxFreq) {
mostFrequent.push(key);
}
}
mostFrequent.sort((a, b) => a - b);
const mode = mostFrequent.length > 1 ? mostFrequent[1] : mostFrequent[0];
console.log(mode);
중앙값은 홀수 개수의 경우 2로 나눈 후에 내림을 해야 중앙값 인덱스를 찾을 수 있기 때문에 Math.floor를 사용하여 구현하였다.
// 중앙값
arr.sort((a, b) => a - b);
const mid = arr[Math.floor(arr.length / 2)];
console.log(mid);
이를 사용한 전체 코드는 아래와 같다.
소스 코드
const input = require('fs')
.readFileSync('/dev/stdin')
.toString()
.trim()
.split(/,| |\n/);
const n = input.shift();
const arr = [...input.map(Number)];
const fixNegativeZero = (num) => (Object.is(num, -0) ? 0 : num);
// 산술평균
const result = arr.reduce((sum, currValue) => sum + currValue, 0);
const mean = fixNegativeZero(Math.round(result / arr.length));
console.log(mean);
// 중앙값
arr.sort((a, b) => a - b);
const mid = arr[Math.floor(arr.length / 2)];
console.log(mid);
// 최빈값
const freqMap = new Map();
let maxFreq = 0;
let mostFrequent = [];
for (let num of arr) {
freqMap.set(num, (freqMap.get(num) || 0) + 1);
maxFreq = Math.max(maxFreq, freqMap.get(num));
}
for (let [key, value] of freqMap) {
if (value === maxFreq) {
mostFrequent.push(key);
}
}
mostFrequent.sort((a, b) => a - b);
const mode = mostFrequent.length > 1 ? mostFrequent[1] : mostFrequent[0];
console.log(mode);
// 최댓값과 최솟값 차이
const max = Math.max(...arr);
const min = Math.min(...arr);
const gap = max - min;
console.log(gap);
728x90
반응형
LIST