본문 바로가기
코딩테스트/백준

[백준] 2109번 순회강연- 자바스크립트

by 핸디(Handy) 2022. 5. 16.

[ 문제 설명 ]

 

2109번: 순회강연

한 저명한 학자에게 n(0 ≤ n ≤ 10,000)개의 대학에서 강연 요청을 해 왔다. 각 대학에서는 d(1 ≤ d ≤ 10,000)일 안에 와서 강연을 해 주면 p(1 ≤ p ≤ 10,000)만큼의 강연료를 지불하겠다고 알려왔다.

www.acmicpc.net


[ 아이디어 ]

  • 일단 가장 비싼 강의 순으로 정렬
  • DeadLine(d)일 안에서만 하면 Price(p)를 주지만 빨리 한다고 돈 많이 주는 건 아니므로, 늦게 할 수 있으면 최대한 늦게 강의를 한다.-> 즉 데드라인 기준일부터 계산하여 하루씩 차감( 그 사이에 다른일이 들어온다면 먼저 하기 위함)

[ 코드 ]

// input 파싱
let input = require("fs").readFileSync("/dev/stdin").toString().split("\n");

let requestLessonCount = Number(input[0]);
if (requestLessonCount === 0) {
  return console.log(0);
}
let inputSchedual = new Array(requestLessonCount);
let dailyIncome = new Array(10000).fill(0);

for (let i = 0; i < requestLessonCount; i++) {
  const [lectureFee, deadLine] = input[i + 1].split(" ").map(Number);
  inputSchedual[i] = {
    lectureFee: lectureFee,
    deadLine: deadLine,
  };
}
// 값 기준으로 내림차순 정렬
inputSchedual.sort((a, b) => b.lectureFee - a.lectureFee);

// 값을 기준으로 스케쥴 확정
for (let i = 0; i < requestLessonCount; i++) {
  for (let j = inputSchedual[i].deadLine; j > 0; j--) {
    if (inputSchedual[i].lectureFee > dailyIncome[j - 1]) {
      dailyIncome[j - 1] = inputSchedual[i].lectureFee;
      break;
    }
  }
}

const sumArray = (arr) => {
  return arr.reduce(function add(sum, currValue) {
    return sum + currValue;
  }, 0);
};
console.log(sumArray(dailyIncome));

각 단계별 확정 일정 배열

[ 팁 ]

숫자 배열일때 배열을 합을 구하는 방법

// 일반 방법
const numberArray = [1, 2, 3, 4];
let total = 0;
for (let i = 0; i < numberArray.length; i++) {
  total += numberArray[i];
}

// 멋진 방법
total = numberArray.reduce(function add(sum, currValue) {
  return sum + currValue;
}, 0);

 

원하는 배열의 길이를 선언하고 바로 초기화

해당 팁은 일반적으로 배열을 선언하면 empty로 값이 보이고 실제 값을 가져오면 undefined로 되는 생성자로 만든 배열객체를 바로 초기화하는 방법입니다.

이를 한번더 응용을 해본다면 0으로 초기화된 2차원 배열을 만들수 있습니다. ( 아래 방법은 ES6 기준 2차원 배열 생성방법)

 

댓글