올해 고3인 브실이는 세계 최고의 명문 대학 브실대학(브론즈실버대학)에 가기 위해서 자신의 현재 점수를 토대로 입시 전략을 세우려고 한다. 브실대학에서는 특정 과목들의 성적의 합을 통해 서류 전형의 합격여부를 결정한다고 한다. 그러나 브실대학에서는 어떤 과목이 서류 평가에 반영되는지 모두 알려주지 않고 일부만 알려주는 사악한 학교다. 브실대학에서 요구하는 과목 수와 반영된다고 공개된 과목들이 주어질 때, 브실이가 얻을 수 있는 최소 점수와 최대 점수를 구해보자.
단, 공개된 과목과 비공개된 과목은 브실이가 수강한 과목에 모두 포함되어 있으며, 과목은 중복되지 않는다.
첫 번째 줄에 브실이가 수강한 과목 수 과 브실대학에서 요구하는 과목 수 , 그리고 브실대학에서 공개한 과목 수 가 공백으로 구분되어 주어진다.
그다음 줄에 걸쳐 브실이가 수강한 과목 이름 과 정수 점수 가 공백으로 구분되어 주어진다. 는 영어 소문자로만 이루어져 있다.
그다음 줄에 걸쳐 브실대학에서 공개한 과목 이름 가 주어진다. 는 영어 소문자로만 이루어져 있다.
브실이가 얻을 수 있는 최소 점수와 최대 점수를 공백으로 구분하여 출력한다.
6 3 2
calculus 100
probability 70
physics 50
chemistry 80
python 90
algorithm 100
physics
python
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 배열에 따로 저장했다.minScore는 unknownScores를 오름차순 정렬한 후, 가장 낮은 점수부터 (m - k)개를 선택해 더한 값에 sum을 더해 계산했다.maxScore는 unknownScores를 내림차순 정렬한 후, 가장 높은 점수부터 (m - k)개를 선택해 더한 값에 sum을 더해 계산했다.Array.prototype.sort()는 원본 배열을 변경하므로, 오름차순과 내림차순 정렬을 각각 따로 구했다.Node.js로 구현하기 좀 힘든 부분도 있어서 맞힌 사람이 얼마나 될지 궁금하여 찾아보니 나 포함 11명밖에 없었다..

근데 엥? 내가 1등?
ㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎ
기념으로 캡처했다 헤헤 ✌️