Coding Problem/DP

[프로그래머스] 도둑질

Yepchani 2025. 1. 29. 16:00
반응형

문제

도둑질

https://school.programmers.co.kr/learn/courses/30/lessons/42897

 

 

 

풀이

설명

도둑이 훔칠 수 있는 돈의 최댓값을 구하는 문제입니다.

 

dp를 사용해 해결할 수 있습니다.

 

집이 원형으로 이어지기 때문에 첫 번째 집을 털면 마지막 집을 털 수 없습니다.

따라서 dp 배열 2개를 사용해 하나는 첫 번째 집을 털 때를, 다른 하나는 첫 번째 집을 털지 않을 때를 계산합니다.

 

dp[i]는 i번째 집까지 거쳤을 때 훔칠 수 있는 돈의 최댓값입니다.

 

점화식은 다음과 같습니다.

dp[i] = Math.max(dp[i - 2] + money[i], dp[i - 1])

 

예시 코드

function solution(money) {
  const n = money.length;
  // 첫 번째 집 포함
  const dp1 = Array(n).fill(0);
  // 첫 번째 집 미포함
  const dp2 = Array(n).fill(0);

  dp1[0] = money[0];
  dp1[1] = money[0];
  dp2[1] = money[1];

  for (let i = 2; i < n - 1; i++) {
    dp1[i] = Math.max(dp1[i - 2] + money[i], dp1[i - 1]);
  }
  for (let i = 2; i < n; i++) {
    dp2[i] = Math.max(dp2[i - 2] + money[i], dp2[i - 1]);
  }

  let max1 = 0;
  let max2 = 0;

  for (let i = 0; i < n; i++) {
    max1 = Math.max(max1, dp1[i]);
    max2 = Math.max(max2, dp2[i]);
  }

  return Math.max(max1, max2);
}

'Coding Problem > DP' 카테고리의 다른 글

[BOJ 9084] 동전  (0) 2025.02.10
[BOJ 2116] 주사위 쌓기  (0) 2025.02.09
[프로그래머스] 거스름돈  (0) 2025.01.17
[프로그래머스] 카운트 다운  (0) 2024.12.28
[프로그래머스] N으로 표현  (0) 2024.12.26