728x90

문제


https://www.acmicpc.net/problem/2108

 

2108번: 통계학

첫째 줄에 수의 개수 N(1 ≤ N ≤ 500,000)이 주어진다. 단, N은 홀수이다. 그 다음 N개의 줄에는 정수들이 주어진다. 입력되는 정수의 절댓값은 4,000을 넘지 않는다.

www.acmicpc.net

 

코드


//실버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() 하는 법을 터득해서 이번에도 한 번에 출력하는 방식으로 해봤다. 
잘못된 내용이나 수정이 필요한 내용이 있으면 언제든 댓글 달아주세요 감사합니다 😀

+ Recent posts