728x90
문제
https://www.acmicpc.net/problem/2108
코드
//실버4 통계학
const fs = require("fs");
const filePath = process.platform === "linux" ? "/dev/stdin" : "./input.txt";
let input = fs.readFileSync(filePath).toString().trim().split("\r\n");
/* 전역변수 선언 */
let map = {}; //최빈값을 구하기 위한 map 선언
let array = []; //최빈값을 구하기 위한 배열 선언
let most = 0; //최빈값 변수
let N = Number(input.shift());
let numbers = input.map((i) => Number(i)).sort((a, b) => a - b); //숫자배열 오름차순 정렬
//각 숫자들에 대해 map에 {'숫자' : 빈도} 입력
for (let num of numbers) {
//이미 map의 key에 해당 숫자가 있다면
if (map[num]) map[num] = map[num] + 1;
else map[num] = 1;
}
let mostFrequency = Math.max(...Object.values(map)); //map의 value(빈도) 중 최대값 받기
//map의 각 key(숫자들)에 대해
for (let key in map) {
//value가 최대빈도라면 array에 해당 key 넣기
if (map[key] === mostFrequency) array.push(key);
}
//최빈값인 숫자가 여러개라면
if (array.length > 1) {
array = array.sort((a, b) => a - b); //오름차순 정렬하여
most = array[1]; //1번째 인덱스 수를 최빈값 변수에 넣기(두번째로 작은 수 출력)
} else most = array[0]; //최빈값인 수가 하나라면 바로 해당 수 최빈값 변수에 넣기
//산술평균
let average = Math.round(
numbers.reduce((acc, cur) => {
return acc + cur;
}, 0) / N
);
let middle = numbers[Math.floor(N / 2)]; //중앙값
let range = numbers[N - 1] - numbers[0]; //범위
console.log(`${average}\n${middle}\n${most}\n${range}`); //한번에 출력
후기
- 산술평균, 중앙값, 범위는 쉽게 구했지만 최빈값에서 은근 시간이 걸렸다. map, array 를 이용하면 충분히 구현할 수 있지만 하드코딩한 감이 없지않아 있다.
- 출력은 저번에 백준 문제를 풀다가 시간 단축을 위해 한 번에 console.log() 하는 법을 터득해서 이번에도 한 번에 출력하는 방식으로 해봤다.
잘못된 내용이나 수정이 필요한 내용이 있으면 언제든 댓글 달아주세요 감사합니다 😀
'알고리즘 > BOJ' 카테고리의 다른 글
[백준] 피보나치 함수 / JavaScript / node.js (0) | 2022.02.15 |
---|---|
[백준] 소수 구하기 / JavaScript / node.js (0) | 2022.02.15 |
[백준] 좌표 정렬하기 / JavaScript / node.js (0) | 2022.02.13 |
[백준] 이전 순열 / JavaScript / node.js (0) | 2022.02.12 |
[백준] 다음 순열 / JavaScript / node.js (0) | 2022.02.12 |