[백준] 2156_포도주 시식 (Javascript)

잭슨·2024년 1월 28일
0

알고리즘 문제 풀이

목록 보기
31/130
post-thumbnail

문제

BOJ2156_포도주 시식

풀이

n이 주어졌을 때 dp[n]이 와인을 마실수 있는 최대값이라고 하고 아래 3가지 경우 중 가장 많이 마실 수 있는 경우 즉, 가장 큰 값을 골라주면 된다.

  1. dp[n-3] + wine[n-1] + wine[n]
  2. dp[n-2] + wine[n]
  3. dp[n-1]

(입력값으로 주어진 wine 배열은 맨 앞에 요소를 추가해주어 dp테이블과 길이가 같도록 만들어 주었다.)

  1. n-3에서 와인을 마실 수 있는 최대값만큼 마시고 n-1번 째 와인과 n번째 와인의 양을 마신다. (n-2번 째를 건너뛰는 연속으로 최대 2잔 까지만 마실수 있기 때문이다.
  2. n-2에서 와인을 마실 수 있는 최대값만큼 마시고 n번 째 와인을 마신다.
  3. n-1번째 와인을 마신다.

이를 코드로 구현해 보면 아래와 같다.

코드 (맞았습니다)

const filePath = process.platform === 'linux' ? '/dev/stdin' : './Javascript/input.txt';
const input = require('fs').readFileSync(filePath).toString().trim().split('\n').map(Number);
const [n, ...wine] = input;
const dp = Array(n + 1).fill(0);
wine.unshift(0);
dp[1] = wine[1];
dp[2] = wine[1] + wine[2];
for (let i = 3; i <= n; i++) {
    dp[i] = Math.max(dp[i - 3] + wine[i - 1] + wine[i], dp[i - 2] + wine[i], dp[i - 1]);
}

console.log(dp[n]);

코드 (틀렸습니다)

const filePath = process.platform === 'linux' ? '/dev/stdin' : './Javascript/input.txt';
const input = require('fs').readFileSync(filePath).toString().trim().split('\n');
const n = +input[0];
const wine = input.slice(1).map(Number);
const dp = Array.from({ length: 2 }, () => Array(n).fill(0));
dp[0][0] = wine[0];
dp[1][0] = wine[0];
dp[0][1] = dp[1][0] + wine[1];
dp[1][1] = wine[1];
for (let i = 2; i < n; i++) {
    dp[0][i] = dp[1][i - 1] + wine[i];
    dp[1][i] = dp[0][i - 2] + wine[i];
}

let answer = 0;
for (let i = 0; i < n; i++) {
    const max = Math.max(dp[0][i], dp[1][i]);
    answer = Math.max(max, answer);
}

console.log(answer);

profile
지속적인 성장

0개의 댓글