[백준 알고리즘] Node.js 12018. Yonsei TOTO

2023. 8. 30. 10:28코딩연습

1. 문제

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

 

12018번: Yonsei TOTO

첫째 줄에는 과목 수 n (1 ≤ n ≤ 100)과 주어진 마일리지 m (1 ≤ m ≤ 100)이 주어진다. 각 과목마다 2줄의 입력이 주어지는데 첫째 줄에는 각 과목에 신청한 사람 수 Pi과 과목의 수강인원 Li이 주어

www.acmicpc.net

 

2. 풀이

  • 주어진 마일리지로 최대로 들을 수 있는 과목의 수를 구하는 문제이다.
  • 마일리지가 같다면 우선순위가 주어진다고 하니, 수강인원 안에만 들어가게 하면 된다. 예를 들면 수강인원이 4명이라면 4번째로 큰 값과 동일하다면 된다는 의미이다.
const inputs = require('fs').readFileSync('/dev/stdin').toString().trim().split("\n");
let [n,m] = inputs.shift().split(" ").map(v => +v); // 과목 수와 마일리지
let subjects = []; // 성준이가 넣을 마일리지를 담을 배열.

// 입력 값이 2줄씩 주어짐!
for(let i = 0; i < n*2; i+=2){
  const [P, L] = inputs[i].split(" ").map(v => +v); // 신청한 사람 수, 수강인원
  const mileages = inputs[i+1].split(" ").map(v => +v).sort((a,b) => b-a); // 마일리지 내림차순 정렬

  // 만약 신청한 사람 수가 수강인원 보다 적다면 최소 마일리지인 1을 넣고
  if(P < L) subjects.push(1);
  else subjects.push(mileages[L-1]); // 아니라면 4번째로 큰 값을 넣음.
}

// 오름차순 정렬해주고
subjects = subjects.sort((a,b) => a-b);

// 가진 마일리지에서 정렬된 배열을 순차적으로 빼주면서 답을 구한다.
let answer = 0;
for(let i = 0; i < subjects.length; i++){
  if(m - subjects[i] >= 0){
    answer++;
    m -= subjects[i];
  }
}

console.log(answer)