jiho_bae
Go devlog
jiho_bae
전체 방문자
오늘
어제
  • 분류 전체보기 (158)
    • JavaScript (38)
      • theory (34)
      • vanilla (4)
    • HTML & CSS (2)
    • Browser (3)
    • CS (6)
      • linux (1)
      • shell (2)
      • compiler (2)
    • DS & Algorithm (87)
      • theory (5)
      • basic (7)
      • programmers (30)
      • baekjoon (45)
    • Design Pattern (2)
    • Error (4)
    • Git & Github (4)
    • Tools (1)
    • 부트캠프 (4)
    • Small Tips (2)
    • Java (3)
    • test (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 카카오 코딩테스트 양궁대회 nodeJS
  • 자바스크립트 커링
  • fetch 취소하기
  • 덧칠하기 javascript
  • 깃 이전 커밋에서 새 브랜치 만들기
  • 리코쳇 로봇 javascript
  • 자바스크립트 배열의 특수함
  • 25632 소수 부르기 게임
  • javascript use strict
  • 프로그래머스 숫자카드나누기 javascript
  • 리액트 프로젝트 디버깅하기
  • 외벽 점검 javascript
  • 억억단을 외우자 javascript
  • safari Date format NaN
  • 백준 17406 nodeJS
  • 퀵정렬 자바스크립트
  • 1753 최단경로 javascript
  • 대충만든자판 javascript
  • 가사 검색 자바스크립트
  • 자바스크립트 모듈 시스템
  • 13460 javascript nodejs
  • 자바스크립트 sort는 왜 그모양일까
  • 병합정렬 자바스크립트
  • JavaScript
  • safari invalid date error
  • 자바스크립트 비동기 마이크로 태스크 큐와 렌더링 과정
  • 백준 자바스크립트 입력 템플릿
  • 계수정렬 자바스크립트
  • 자바스크립트 채팅방 스크롤
  • 자바스크립트 이벤트 위임

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
jiho_bae

Go devlog

[백준] 2108번 통계학 - JavaScript(NodeJS)
DS & Algorithm/baekjoon

[백준] 2108번 통계학 - JavaScript(NodeJS)

2021. 7. 18. 00:16

문제

 

2108번: 통계학

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

www.acmicpc.net

 

코드

function sol(input) {
  let answer = "";
  const N = +input[0];
  const numbers = input
    .slice(1)
    .map(Number)
    .sort((a, b) => a - b);

  answer += `${Math.round(numbers.reduce((s, v) => s + v, 0) / N)}\n`;
  answer += `${numbers[Math.floor(N / 2)]}\n`;

  const map = new Map();
  let max = 1;
  for (let number of numbers) {
    if (map.has(number)) {
      max = Math.max(max, map.get(number) + 1);
      map.set(number, map.get(number) + 1);
    } else map.set(number, 1);
  }

  const maxArr = [];
  for (let [key, val] of map) {
    if (val === max) maxArr.push(key);
  }

  answer += maxArr.length === 1 ? `${maxArr[0]}\n` : `${maxArr[1]}\n`;
  answer += `${numbers[N - 1] - numbers[0]}\n`;
  return answer;
}

const input = [];
require("readline")
  .createInterface(process.stdin, process.stdout)
  .on("line", (line) => {
    input.push(line);
  })
  .on("close", () => {
    console.log(sol(input));
    process.exit();
  });

 

풀이

 

문제의 조건은 아래를 참고하자.

 

 

숫자 수를 변수 N에 담고, numbers 배열에 모든 수를 담는다.

numbers 배열은 오름차순 정렬한다.

 

산술평균 구하기

numbers 배열 원소의 총 합을 N으로 나눈다.

 

중앙값 구하기

숫자 N이 홀수이며 numbers 배열은 정렬된 상태이므로, 중앙에 위치한 값이 중앙값이다.

 

최빈값 구하기

map 자료구조를 통해 numbers 배열 원소마다 빈도수를 기록하고, 가장 많이 출현한 값을 기록해둔다.
map 자료구조로부터 가장 많이 출현한 값에 해당하는 원소들을 모두 maxArr 배열에 담는다.
maxArr 배열에 담긴 원소가 2개 이상이면 두번째로 작은 값을 출력하고, 1개라면 그 값이 최빈값이다.

 

범위 구하기

numbers 배열의 마지막 원소에서 첫번째 원소를 빼면 범위이다.

 

 

주석을 포함한 코드

function sol(input) {
  let answer = "";
  const N = +input[0];
  const numbers = input
    .slice(1)
    .map(Number)
    .sort((a, b) => a - b); // 모든 숫자를 numbers 배열에 받아 오름차순 정렬

  answer += `${Math.round(numbers.reduce((s, v) => s + v, 0) / N)}\n`; // 산술평균
  answer += `${numbers[Math.floor(N / 2)]}\n`; // 중앙값

  const map = new Map();
  let max = 1;
  for (let number of numbers) {
    if (map.has(number)) {
      max = Math.max(max, map.get(number) + 1);
      map.set(number, map.get(number) + 1);
    } else map.set(number, 1);
  } // map 자료구조를 통해 숫자 별 빈도수 기록

  const maxArr = [];
  for (let [key, val] of map) {
    if (val === max) maxArr.push(key);
  } // maxArr 배열에 최빈값 후보에 해당하는 모든 원소를 넣어준다.

  answer += maxArr.length === 1 ? `${maxArr[0]}\n` : `${maxArr[1]}\n`;
  // 최빈값이 여러개면 두번째로 작은 값, 1개라면 최빈값.
  answer += `${numbers[N - 1] - numbers[0]}\n`; // 범위
  return answer;
}

// 백준에서 입력 받기.
const input = [];
require("readline")
  .createInterface(process.stdin, process.stdout)
  .on("line", (line) => {
    input.push(line);
  })
  .on("close", () => {
    console.log(sol(input));
    process.exit();
  });
저작자표시 (새창열림)

'DS & Algorithm > baekjoon' 카테고리의 다른 글

[백준] 13460번 구슬 탈출 2 - 자바스크립트  (0) 2022.03.25
[백준] 1541번 잃어버린 괄호 - JavaScript(NodeJS)  (0) 2021.07.19
[백준] 2231번 분해합 - JavaScript(NodeJS)  (0) 2021.07.16
[백준] 3055번 탈출 - JavaScript(NodeJS)  (0) 2021.07.07
[백준] 1316번 그룹 단어 체커 - JavaScript(NodeJS)  (0) 2021.07.02
    'DS & Algorithm/baekjoon' 카테고리의 다른 글
    • [백준] 13460번 구슬 탈출 2 - 자바스크립트
    • [백준] 1541번 잃어버린 괄호 - JavaScript(NodeJS)
    • [백준] 2231번 분해합 - JavaScript(NodeJS)
    • [백준] 3055번 탈출 - JavaScript(NodeJS)
    jiho_bae
    jiho_bae
    하루에 한 걸음씩

    티스토리툴바