캐또's coding

2108 - 통계학 - node.js 본문

기초 공부/백준 문제 풀이

2108 - 통계학 - node.js

JS_K_coding 2023. 1. 9. 14:41

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

 

2108번: 통계학

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

www.acmicpc.net


통계학이라는 이름이 붙긴 했지만, 사실상 기존에 써먹었던 방법들을 재활용하면 쉽게 해결 가능한 문제, 다만 문제가 있었다면 세 번째 문제인 최빈값을 구하는 부분이었는데, 이 부분은 검색을 통해서 map의 사용으로 해결되었다.

 

const fs = require("fs");
const { join } = require("path");
const input = fs.readFileSync("/dev/stdin").toString().trim().split("\n").map(Number);
//언제나 그렇듯 숫자를 가져오는 부분은 같다.

const result = [];
//최종 결과값을 넣을 array를 하나 뚫어줬다.

const cnt = input.shift();
//입력값의 첫 번째 숫자가 들어오는 것을 따로 빼줬다.

const sorted = input.sort((a, b) => a - b);
//숫자가 순서대로 있든 아니든 상관 없기 때문에 문제 풀이를 원활히 할 목적으로 우선 수들을 정렬했다.

result.push(Math.round(sorted.reduce((sum, curr) => sum + curr, 0) / cnt));
//1번 문제인 산술평균. 숫자를 돌면서 모두 더한 값을 반올림하고 따로 빼둔 cnt 값으로 나눠준다.

result.push(sorted[Math.floor(cnt / 2)]);
//2번 문제인 중앙값. 이전 문제를 참고해서 정렬한 값의 가운데 인덱스=cnt/2값으로 나온다

const map = new Map();
let max = 1;
//3번 문제해결을 위해 우선 map, max횟수의 값은 1로 설정

for (let nums of sorted) {
  if (map.has(nums)) {
    max = Math.max(max, map.get(nums) + 1);
    map.set(nums, map.get(nums) + 1);
  } else map.set(nums, 1);
}
//반복문을 돌면서 숫자들을 하나씩 대입해본다.
//만약 반복문을 돌았을 때 숫자가 map에 없으면?
//=> map.set(그 숫자를 key로, 초기값으로 1)

//반복문으로 숫자들을 돌면서 만약 map에 숫자가 있다면?
//=>지금 들어있는 key의 값에 +1한 값과 비교해서 큰 값이 max가 되고
//map.set으로 지금 key의 값+1로 설정

//map 안은 (숫자, 그 숫자의 갯수)가 된다. 

const maxArr = [];
for (let [key, val] of map) {
  if (val === max) maxArr.push(key);
}
//map을 반복문으로 돌면서 map의 value값(숫자갯수)가 동일하면 그 수가 가장 많이 출현한 수가 된다.
//=> 그 key를 maxArr에 넣는다.

result.push(maxArr.length === 1 ? maxArr[0] : maxArr[1]);
//결과값에 추가할 때 maxArr.length가 1인지를 보고 두번째 수 혹은 그 수를 최빈값으로 result에 넣는다.

result.push(sorted[cnt - 1] - sorted[0]);
//마지막 범위값. array에서 cnt-1 인덱스(왜냐면 cnt로 하면 인덱스가 0부터 시작하니까 밖으로 나가버림)
//그리고 array에서 0번 인덱스를 빼주면 끝

console.log(result.join("\n"));
//결과를 '\n'을 넣어서 출력해주면 해결
Comments