| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | |||
| 5 | 6 | 7 | 8 | 9 | 10 | 11 |
| 12 | 13 | 14 | 15 | 16 | 17 | 18 |
| 19 | 20 | 21 | 22 | 23 | 24 | 25 |
| 26 | 27 | 28 | 29 | 30 |
Tags
- const
- 자바스크립트 일급객체
- 1789 node.js
- 백준1026
- 노마드스터디
- 개발자
- 모던자바스크립트
- 코딩
- 개인프로젝트
- 2217 node.js
- 1541 node.js
- 21313 nodejs
- 모던자바스크립트DeepDive
- 11047 node.js
- CSS flex
- 백준1789
- 11399 node.js
- 1026 node.js
- 백준21313
- IT5분잡학사전
- 자바스크립트 딥다이브
- 1931 node.js
- 14655 nodejs
- flex box
- 노마드북클럽
- 백준25176
- 모던자바스크립트 딥다이브
- 노개북
- 자바스크립트 함수
- Javascript
Archives
- Today
- Total
캐또's coding
2108 - 통계학 - node.js 본문
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'을 넣어서 출력해주면 해결'기초 공부 > 백준 문제 풀이' 카테고리의 다른 글
| 11650 - 좌표 정렬하기 - node.js (0) | 2023.01.11 |
|---|---|
| 1427 - 소트인사이드 - node.js (0) | 2023.01.10 |
| 10989 - 수 정렬하기 3 - node.js (0) | 2023.01.08 |
| 2751 - 수 정렬하기 2 - node.js (0) | 2023.01.07 |
| 25305 - 커트라인 - node.js (0) | 2023.01.06 |
Comments