[백준] 2156. 포도주 시식(자바스크립트/javascript/node.js/js/다이나믹프로그래밍/동적프로그래밍/동적계획법)
2021. 7. 9. 13:40ㆍFront-end/알고리즘
728x90
반응형
문제를 풀기 위한 아이디어
dp 배열을 만든다. dp[N]에는 포도주의 개수가 N개일 때 최댓값이 저장될 것이다.
dp[1] = wine[1] (포도주가 1개밖에 없을 때에는 무조건 1개의 포도주를 마시는게 최댓값이다.)
dp[2] = wine[1] + wine[2] (포도주가 2개밖에 없을 때에는 무조건 2개의 포도주를 모두 마시는게 최댓값이다.)
dp[3] = (wine[1] + wine[2] , wine[2] + wine[3] , wine[1] + wine[3]) 이 3가지 경우에서 가장 큰 값이 최댓값이 된다. (연속해서 3잔을 먹을 순 없기 때문에)
dp[4]부터는 dp[N]을 어떻게 구할 수 있을까?
위의 그림이 모든 것을 설명해준다. 즉 저 위의 3가지 경우 중 최댓값이 dp[N]이 된다.
내가 작성한 코드 (자바스크립트)
let fs = require("fs");
let wine = fs
.readFileSync("/dev/stdin")
.toString()
.split("\n")
.map((element) => Number(element));
const number = wine[0];
const dp = new Array(number + 1);
dp[1] = wine[1];
dp[2] = wine[1] + wine[2];
dp[3] = Math.max(wine[1] + wine[2], wine[2] + wine[3], wine[1] + wine[3]);
for (let n = 4; n <= number; n++) {
dp[n] = Math.max(
dp[n - 3] + wine[n - 1] + wine[n],
dp[n - 2] + wine[n],
dp[n - 1]
);
}
console.log(dp[number]);
728x90
반응형