백준 29723번 브실이의 입시전략 Node.js

찌니월드·2025년 4월 17일

문제

올해 고3인 브실이는 세계 최고의 명문 대학 브실대학(브론즈실버대학)에 가기 위해서 자신의 현재 점수를 토대로 입시 전략을 세우려고 한다. 브실대학에서는 특정 과목들의 성적의 합을 통해 서류 전형의 합격여부를 결정한다고 한다. 그러나 브실대학에서는 어떤 과목이 서류 평가에 반영되는지 모두 알려주지 않고 일부만 알려주는 사악한 학교다. 브실대학에서 요구하는 과목 수와 반영된다고 공개된 과목들이 주어질 때, 브실이가 얻을 수 있는 최소 점수와 최대 점수를 구해보자.

단, 공개된 과목과 비공개된 과목은 브실이가 수강한 과목에 모두 포함되어 있으며, 과목은 중복되지 않는다.

입력

첫 번째 줄에 브실이가 수강한 과목 수 NN과 브실대학에서 요구하는 과목 수 MM, 그리고 브실대학에서 공개한 과목 수 KK가 공백으로 구분되어 주어진다.
(1KMN10000)(1 \le K \le M \le N \le 10\,000)

그다음 NN줄에 걸쳐 브실이가 수강한 과목 이름 sis_i과 정수 점수 pip_i가 공백으로 구분되어 주어진다. sis_i는 영어 소문자로만 이루어져 있다. (3si20;(3 \le |s_i| \le 20; 0pi100)0 \le p_i \le 100)

그다음 KK줄에 걸쳐 브실대학에서 공개한 과목 이름 tit_i가 주어진다. tit_i는 영어 소문자로만 이루어져 있다. (3ti20)(3 \le |t_i| \le 20)

출력

브실이가 얻을 수 있는 최소 점수와 최대 점수를 공백으로 구분하여 출력한다.

예제 입력 1

6 3 2
calculus 100
probability 70
physics 50
chemistry 80
python 90
algorithm 100
physics
python

예제 출력 1

210 240

나의 풀이

const fs = require("fs");
const input = fs.readFileSync("/dev/stdin").toString().trim().split("\n");

const [n, m, k] = input[0].split(" ").map(Number);

// 수강한 과목 저장
const scoreMap = new Map();

for (let i = 1; i <= n; i++) {
  const [subject, score] = input[i].split(" ");
  scoreMap.set(subject, Number(score));
}

// 공개된 과목 저장
const knownSubjects = input.slice(n + 1);

let sum = 0;

for (let subject of knownSubjects) {
  if (scoreMap.has(subject)) {
    sum += scoreMap.get(subject);
    scoreMap.delete(subject);
  }
}

const unknownScores = [...scoreMap.values()];

// 최소 점수
unknownScores.sort((a, b) => a - b);
const minScore = sum + unknownScores.slice(0, m - k).reduce((acc, v) => acc + v, 0);

// 최대 점수
unknownScores.sort((a, b) => b - a);
const maxScore = sum + unknownScores.slice(0, m - k).reduce((acc, v) => acc + v, 0);

console.log(minScore, maxScore);

풀이 설명

  • 브실이가 수강한 과목과 점수를 매핑하기 위해 Map에 저장했다.
  • 브실대학에서 공개한 과목들의 점수는 반드시 포함되므로, 이들의 점수를 sum 변수에 더했다.
  • sum에 더한 공개 과목은 이후 계산에서 제외하기 위해 Map에서 제거했다.
  • 나머지 비공개 과목들의 점수는 unknownScores 배열에 따로 저장했다.
  • 최소 점수 minScoreunknownScores를 오름차순 정렬한 후, 가장 낮은 점수부터 (m - k)개를 선택해 더한 값에 sum을 더해 계산했다.
  • 최대 점수 maxScoreunknownScores를 내림차순 정렬한 후, 가장 높은 점수부터 (m - k)개를 선택해 더한 값에 sum을 더해 계산했다.
  • Array.prototype.sort()는 원본 배열을 변경하므로, 오름차순과 내림차순 정렬을 각각 따로 구했다.

Node.js 맞힌 사람 중 내가 1등 ㅎ

Node.js로 구현하기 좀 힘든 부분도 있어서 맞힌 사람이 얼마나 될지 궁금하여 찾아보니 나 포함 11명밖에 없었다..

근데 엥? 내가 1등?
ㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎ

기념으로 캡처했다 헤헤 ✌️

profile
Front-End Developer

0개의 댓글