백준 2108 - 통계학

민순기·2022년 2월 28일
0

통계학 문제 바로가기

문제

내 코드

const [n, ...arr] = require("fs")
  .readFileSync("/dev/stdin")
  .toString()
  .trim()
  .split("\n");

const obj = {};
const numbers = arr
  .map((el) => {
    if (obj[el]) obj[el] += 1;
    else obj[el] = 1;
    return Number(el);
  })
  .sort((a, b) => a - b);

const modeTimes = Math.max(...Object.values(obj));
const modeArr = [
  ...new Set(
    Object.keys(obj)
      .sort((a, b) => a - b)
      .filter((el) => obj[el] === modeTimes)
  ),
];
const avg = Math.round(
  numbers.reduce((acc, cur) => acc + cur, 0) / numbers.length
);

console.log(avg === -0 ? 0 : avg);
console.log(numbers[Math.floor(numbers.length / 2)]);
console.log(modeArr[1] || modeArr[0]);
console.log(numbers[numbers.length - 1] - numbers[0]);

어려웠던 점

사실 알고리즘을 떠올리고 문제를 푸는게 어렵지는 않았다.
다만 최빈값을 구하는 곳에서 메모리 초과나 시간 초과 혹은 이상하게 66%쯤에서 틀리는 경우가 생겨서 골치가 많이 아팠다.

메모리 초과는 numbers 배열 하나와 obj객체 하나만 생성하는 것으로 해결했다. 메모리 초과를 해결하고 나니까 시간초과도 자연스럽게 해결이 됐다. 그냥 배열이 많아지니까 반복횟수도 많아져서 시간 초과 뜬것 같다. 66%에서 틀리는 건 이유는 잘 모르겠는데

const modeArr = [
  ...new Set(
    Object.keys(obj)
      .sort((a, b) => a - b)
      .filter((el) => obj[el] === modeTimes)
  ),
];

이 부분의 Object.keys(obj).sort((a, b) => a - b)가 원래는 그냥 numbers였는데 이렇게 바꾸고 나니까 해결됐다. 아마 정렬 혹은 중복이 문제였지 않을까 싶다.

profile
2년차 FE 개발자 민순기입니다.

0개의 댓글