Coding Problem/DP

[BOJ 1309] 동물원

Yepchani 2024. 10. 19. 12:45
반응형

문제

동물원

https://www.acmicpc.net/problem/1309

 

 

풀이

2 x N 크기의 우리에 사자를 배치하는 경우의 수를 구하는 문제입니다.

 

규칙은 다음과 같습니다.

  • 사자들을 우리에 가둘 때, 가로 또는 세로로 붙어있게 배치할 수는 없습니다.
  • 한 마리도 배치하지 않는 경우도 하나의 경우의 수로 칩니다.

 

DP를 이용해 해결할 수 있습니다.

 

dp[i]는 i번째 우리에 [사자가 없을 때, 좌측에 있을 때, 우측에 있을 때] 입니다.

dp[1] = [1, 1, 1]로 초기화 해줍니다.

 

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

 

i번째 우리에 사자가 없을 때, dp[i][0]은 i - 1번째 우리의 모든 경우의 수를 합친 값입니다.

dp[i][0] = dp[i - 1].reduce((acc, cur) => (acc + cur), 0);

 

i번째 우리의 좌측에 사자가 있을 때, dp[i][1]은 i - 1번째 우리에서 사자가 없을 때와 우측에 있을 때의 경우의 수를 합친 값입니다.
dp[i][1] = (dp[i - 1][0] + dp[i - 1][2])

 

i번째 우리의 우측에 사자가 있을 때, dp[i][2]은 i - 1번째 우리에서 사자가 없을 때와 좌측에 있을 때의 경우의 수를 합친 값입니다.
dp[i][2] = (dp[i - 1][0] + dp[i - 1][1])

 

예시 코드

function solution() {
  const n = Number(input());
  const dp = Array.from({ length: n + 1 }, () => Array(3).fill(0));
  // dp[i]는 i번째 우리에 [사자가 없을 때, 좌측에 있을 때, 우측에 있을 때]
  dp[1] = [1, 1, 1];
  const DIVISOR = 9901;

  for (let i = 2; i <= n; i++) {
    dp[i][0] = dp[i - 1].reduce((acc, cur) => (acc + cur) % DIVISOR, 0);
    dp[i][1] = (dp[i - 1][0] + dp[i - 1][2]) % DIVISOR;
    dp[i][2] = (dp[i - 1][0] + dp[i - 1][1]) % DIVISOR;
  }

  return dp[n].reduce((acc, cur) => (acc + cur) % DIVISOR, 0);
}

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

[프로그래머스] 3 x n 타일링  (0) 2024.12.25
[프로그래머스] 가장 큰 정사각형 찾기  (0) 2024.11.23
[BOJ 15989] 1, 2, 3 더하기 4  (0) 2024.09.05
[BOJ 5582] 공통 부분 문자열  (0) 2023.12.13
BOJ 2225 합분해  (2) 2023.11.25