알고리즘별 풀기-> 브루트포스 알고리즘에서 14501문제를 만났다.
알고리즘이 브루트포스 알고리즘이여서 완전탐색과 백트래킹, 재귀를 생각하며 문제를 품
하지만 푸면 풀수록 조건들이 까다로워져서 구글링을 해봤더니 대부분이 dp를 활용해서 품
dp는 큰 문제를 작은 문제로 나누고 그 작은 문제의 답이 중복되고 재사용되는 경우에 사용함
let n = +input.shift()
let arr = input.map(v=>v.split(' ').map(Number))
n을 7로 두고
뒤에 나오는 7줄의 값을 배열로 저장
[ [ 3, 10 ],[ 5, 20 ],[ 1, 10 ],[ 1, 20 ],[ 2, 15 ],[ 4, 40 ],[ 1, 200 ] ]
dp를 활용하기 위해 길이가 n인 빈 배열 dp를 생성
for문을 돌면서 dp에 돈을 채워넣음
만약 a일부터 b일동안 일했는데 a+b가 n을 넘어가는 경우는 넘어감
dp => 10,0,0,10,10,10,10
dp => 10,20,0,10,10,10,20
dp => 10,20,10,10,10,10,20
dp => 10,20,10,30,30,30,30
dp => 10,20,10,30,45,30,45
dp => 10,20,10,30,45,30,45
dp => 10,20,10,30,45,30,45
const fs = require('fs');
const input = fs.readFileSync('../text.txt').toString().split('\n');
let n = +input.shift()
let arr = input.map(v=>v.split(' ').map(Number))
const dp = new Array(n).fill(0)
for (let i = 0; i < n; i++) { // 0일~6일
console.log("for문 돌고 dp",dp)
const [duration, profit] = arr[i];
console.log("i+duration",i+duration,n)
if (i + duration > n){
console.log("넘어감")
continue
}
dp[i] += profit;
console.log("dp",dp);
for (let j = i + duration; j < n; j++) {
console.log("i,j",i,j)
console.log("--, j",j,dp[i], dp[j]);
dp[j] = Math.max(dp[j], dp[i]);
console.log("after",dp[j])
}
}
console.log(Math.max(...dp));
🫠