알고리즘

[백준 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