문제
코드
function sol(input) {
let answer = "";
const N = +input[0];
const numbers = input
.slice(1)
.map(Number)
.sort((a, b) => a - b);
answer += `${Math.round(numbers.reduce((s, v) => s + v, 0) / N)}\n`;
answer += `${numbers[Math.floor(N / 2)]}\n`;
const map = new Map();
let max = 1;
for (let number of numbers) {
if (map.has(number)) {
max = Math.max(max, map.get(number) + 1);
map.set(number, map.get(number) + 1);
} else map.set(number, 1);
}
const maxArr = [];
for (let [key, val] of map) {
if (val === max) maxArr.push(key);
}
answer += maxArr.length === 1 ? `${maxArr[0]}\n` : `${maxArr[1]}\n`;
answer += `${numbers[N - 1] - numbers[0]}\n`;
return answer;
}
const input = [];
require("readline")
.createInterface(process.stdin, process.stdout)
.on("line", (line) => {
input.push(line);
})
.on("close", () => {
console.log(sol(input));
process.exit();
});
풀이
문제의 조건은 아래를 참고하자.
숫자 수를 변수 N에 담고, numbers 배열에 모든 수를 담는다.
numbers 배열은 오름차순 정렬한다.
산술평균 구하기
numbers 배열 원소의 총 합을 N으로 나눈다.
중앙값 구하기
숫자 N이 홀수이며 numbers 배열은 정렬된 상태이므로, 중앙에 위치한 값이 중앙값이다.
최빈값 구하기
map 자료구조를 통해 numbers 배열 원소마다 빈도수를 기록하고, 가장 많이 출현한 값을 기록해둔다.
map 자료구조로부터 가장 많이 출현한 값에 해당하는 원소들을 모두 maxArr 배열에 담는다.
maxArr 배열에 담긴 원소가 2개 이상이면 두번째로 작은 값을 출력하고, 1개라면 그 값이 최빈값이다.
범위 구하기
numbers 배열의 마지막 원소에서 첫번째 원소를 빼면 범위이다.
주석을 포함한 코드
function sol(input) {
let answer = "";
const N = +input[0];
const numbers = input
.slice(1)
.map(Number)
.sort((a, b) => a - b); // 모든 숫자를 numbers 배열에 받아 오름차순 정렬
answer += `${Math.round(numbers.reduce((s, v) => s + v, 0) / N)}\n`; // 산술평균
answer += `${numbers[Math.floor(N / 2)]}\n`; // 중앙값
const map = new Map();
let max = 1;
for (let number of numbers) {
if (map.has(number)) {
max = Math.max(max, map.get(number) + 1);
map.set(number, map.get(number) + 1);
} else map.set(number, 1);
} // map 자료구조를 통해 숫자 별 빈도수 기록
const maxArr = [];
for (let [key, val] of map) {
if (val === max) maxArr.push(key);
} // maxArr 배열에 최빈값 후보에 해당하는 모든 원소를 넣어준다.
answer += maxArr.length === 1 ? `${maxArr[0]}\n` : `${maxArr[1]}\n`;
// 최빈값이 여러개면 두번째로 작은 값, 1개라면 최빈값.
answer += `${numbers[N - 1] - numbers[0]}\n`; // 범위
return answer;
}
// 백준에서 입력 받기.
const input = [];
require("readline")
.createInterface(process.stdin, process.stdout)
.on("line", (line) => {
input.push(line);
})
.on("close", () => {
console.log(sol(input));
process.exit();
});
'DS & Algorithm > baekjoon' 카테고리의 다른 글
[백준] 13460번 구슬 탈출 2 - 자바스크립트 (0) | 2022.03.25 |
---|---|
[백준] 1541번 잃어버린 괄호 - JavaScript(NodeJS) (0) | 2021.07.19 |
[백준] 2231번 분해합 - JavaScript(NodeJS) (0) | 2021.07.16 |
[백준] 3055번 탈출 - JavaScript(NodeJS) (0) | 2021.07.07 |
[백준] 1316번 그룹 단어 체커 - JavaScript(NodeJS) (0) | 2021.07.02 |