백준 14501 퇴사

bkboy·2022년 5월 30일
0

백준 초급

목록 보기
41/80

문제

제한사항

입출력 예

풀이

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

const solution = (N, counseling) => {
  const dp = new Array(N).fill(0);

  for (let i = 0; i < N; i++) {
    const [cost, profit] = counseling[i];
    if (i + cost > N) continue;
    dp[i] = dp[i] + profit;
    for (let j = i + cost; j < N; j++) {
      dp[j] = Math.max(dp[j], dp[i]);
    }
  }
  return Math.max(...dp);
};

const N = Number(input[0]);
const counseling = input
  .slice(1)
  .map((v) => v.split(' ').map(Number));

console.log(solution(N, counseling));
  • 다이나믹 프로그래밍 방식으로 풀어야한다.
  • i는 idex이면서도 몇일째 인지를 표현해준다. 그래서 i + cost의 값을 비교하는 조건문을 사용하였다.
  • 최대값을 넘어가면 할 수 없는 일이니 다음 요소를 본다.
  • 넘어가지 않았다면 dp배열에 값을 누적한다. 그리고 i+cost 인덱스의 dp배열에도 같은 값을 할당해준다.
  • 예를 들어 첫째날에 3일 걸리는 일을 했다. 그럼 2~3일에는 다른 일을 못하니 4일째의 dp값도 일단 1일째의 dp값과 같아지는 것이다.(처음엔 0일테니)

복습

const input = ["7", "3 10", "5 20", "1 10", "1 20", "2 15", "4 40", "2 200"];

const sol = (input) => {
  const n = +input.shift();
  const arr = input.map((e) => e.split(" ").map(Number));

  const dp = new Array(n).fill(0);

  for (let i = 0; i < n; i++) {
    const [cost, money] = arr[i];
    if (i + cost > n) continue;
    dp[i] = dp[i] + money;
    for (let j = i + cost; j < n; j++) {
      dp[j] = Math.max(dp[j], dp[i]);
    }
  }
  return Math.max(...dp);
};

console.log(sol(input));
profile
음악하는 개발자

0개의 댓글