백준 2108번 통계학-JS

yugyeongKim·2021년 11월 7일
0

백준

목록 보기
35/52
post-custom-banner

빈도수 다른분 참고 아 max구하는 법만 알았어도 까비

- 제출한 코드

const fs = require('fs');
const filePath = process.platform === 'linux' ? '/dev/stdin' : './input.txt';
let input = fs.readFileSync(filePath).toString().trim().split('\n');
let N = Number(input.shift());
let numArr = input.map(x => +x);
let len = numArr.length;
let answer = '';
let avg = center = countNum = range = 0;

numArr.sort(function (a,b) {return a - b;});
//각 숫자를key 그 숫자의 빈도를 value값에 담음
const uniq = numArr.reduce((accu, curr) => { 
  accu[curr] = (accu[curr] || 0)+1; 
  return accu;
}, {});

let minArr = [];
let uniqMaxNum = Math.max.apply(null, Object.values(uniq));
Object.keys(uniq).forEach(function(key) {
  if(uniq[key] === uniqMaxNum) {
    minArr.push(key);
  }
});

if(minArr.length > 1) {
  minArr.sort(function (a,b) {return a - b;});
  countNum = minArr[1];
} else {
  countNum = minArr[0];
}

let sum = numArr.reduce((a,b) => {return a+b;});
avg = Math.round(sum/N);
center = numArr[Math.floor(len/2)];
range = numArr[len-1] - numArr[0];
answer = avg + '\n' + center + '\n' + countNum + '\n' + range;
console.log(answer);
  • 평균: reduce이용해서 더하고 round로 소수점 버리기
  • 중앙값: len/2의 소수점을 버린값이 index인 numArr값
  • 범위: [len-1]-[0]

빈도구하는 법
1. 각 숫자를 key값으로, 그 숫자의 빈도수를 value값으로 가지는 딕셔너리 uniq을 생성
2. nuiq에서 value가 가장 큰 수를 uniqMaxNum에 저장
3. 모든 딕셔너리에서 value값이 uniqMaxNum과 같은 key값을 minArr에 저장
4. minArr길이가 1이상이면 정렬 후 배열의 두번째 값을 빈도수로 저장, 아니면 배열의 첫번째 값을 빈도수로 저장

- 새롭게 알게 된 점

  • 딕셔너리의 value값의 max 구하기
    Math.max.apply(null, Object.values(dic)
    배열에서 가장 큰 값을 구하는 법:
    Math.max.apply(null, arr)

  • 빈도수만큼 딕셔너리에 정리
    const uniq = numArr.reduce((accu, curr) => {
    accu[curr] = (accu[curr] || 0)+1;
    return accu;
    }, {});

post-custom-banner

0개의 댓글