[JS][백준]2108_통계학
Algorithm/BaeKJoon

[JS][백준]2108_통계학

문제 번호

 

2108번: 통계학

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

www.acmicpc.net

 

 

알고리즘 분류

 구현, 정렬

 

문제 풀이

 특별한 알고리즘은 없는 문제이다. 문제에서 주어진 내용대로 구현해서 출력만 하면된다.

 

산술평균

  // 산술 평균
  let sum = 0;
  for (let i = 0; i < input.length; i++) {
    sum += Number(input[i]);
  }
  arithmeticMean = Math.round(sum / input.length);
  console.log(arithmeticMean);

 

중앙값 

  // 중앙값.  
  mid = Number(input[parseInt((input.length) / 2)]);
  console.log(mid);

 

최빈값

 문제에서 양수와 음수 모두 등장하기때문에 num 배열의 0번 인덱스부터 4000 인덱스는 양수를 저장하기 위해서 사용하였고, 4001번부터 8000번 까지는 음수를 저정하기 위해서 사용하였다. 그리고나서 최빈수가 되기 위해서는 최소 몇번 등장해야하는가를 계산하여 최빈값 후보들을 mostAppearances 배열에 추가하였다.

// 최빈값.
  let max = 0;
  mostAppearances = [];
  let num = new Array(8001);
  num.fill(0, 0, 8001);
  // 각 숫자가 몇번씩 등장했는지 계산한다.
  for (let i = 0; i < input.length; i++) {
    if (input[i] < 0) {
      num[-(input[i]) + 4000]++;
    }
    else if (input[i] >= 0) {
      num[Number(input[i])]++;
    }
  }
  // 몇 번 이상 등장해야 최빈수가 될 수 있는지 확인한다.
  for (let i = 0; i < num.length; i++) {
    if (num[i] > max) max = num[i];
  }

  for (let i = 8000; i >= 4001; i--) {
    if (num[i] !== 0 && num[i] >= max) {
      mostAppearances.push(-(i - 4000));
    }
  }
  for (let i = 0; i <= 4000; i++) {
    if (num[i] !== 0 && num[i] >= max) {
      mostAppearances.push(i);
    }
  }
  
  if (mostAppearances.length === 1) console.log(mostAppearances[0]);
  else if (mostAppearances.length >= 2) console.log(mostAppearances[1]);

 

범위

// 범위.
  range = input[input.length - 1] - input[0];
  console.log(range);

 

전체코드

const fs = require('fs');
const input = fs.readFileSync('통계학/input.txt').toString().trim().split('\n');

const N = Number(input.shift());

const sol = function () {
  let arithmeticMean;
  let mid;
  let mostAppearances;
  let range;

  input.sort((a, b) => a - b);

  // 산술 평균
  let sum = 0;
  for (let i = 0; i < input.length; i++) {
    sum += Number(input[i]);
  }
  arithmeticMean = Math.round(sum / input.length);
  console.log(arithmeticMean);

  // 중앙값.  
  mid = Number(input[parseInt((input.length) / 2)]);
  console.log(mid);

  // 최빈값.
  let max = 0;
  mostAppearances = [];
  let num = new Array(8001);
  num.fill(0, 0, 8001);

  // 각 숫자가 몇번씩 등장했는지 계산한다.
  for (let i = 0; i < input.length; i++) {
    if (input[i] < 0) {
      num[-(input[i]) + 4000]++;
    }
    else if (input[i] >= 0) {
      num[Number(input[i])]++;
    }
  }
  // 몇 번 이상 등장해야 최빈수가 될 수 있는지 확인한다.
  for (let i = 0; i < num.length; i++) {
    if (num[i] > max) max = num[i];
  }

  for (let i = 8000; i >= 4001; i--) {
    if (num[i] !== 0 && num[i] >= max) {
      mostAppearances.push(-(i - 4000));
    }
  }
  for (let i = 0; i <= 4000; i++) {
    if (num[i] !== 0 && num[i] >= max) {
      mostAppearances.push(i);
    }
  }
  
  if (mostAppearances.length === 1) console.log(mostAppearances[0]);
  else if (mostAppearances.length >= 2) console.log(mostAppearances[1]);

  // 범위.
  range = input[input.length - 1] - input[0];
  console.log(range);

}

sol();

 

특이사항

 Math 내장 객체에 있는 round 메서드를 사용하여 반올림을 하였다.