코딩하는 해맑은 거북이

[Python] 동물원 - 백준 (DP) 본문

코딩테스트

[Python] 동물원 - 백준 (DP)

#CJE 2023. 6. 5.
해당 글은 백준 1309번 문제 '동물원'을 다룬다.

문제

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

 

1309번: 동물원

첫째 줄에 우리의 크기 N(1≤N≤100,000)이 주어진다.

www.acmicpc.net

 

설명

해당 문제는 DP 문제이고, 9901로 나눈 나머지를 출력하라는데서도 힌트를 얻을 수 있다.

그리고 한 마리도 배치하지 않는 경우도 하나의 경우의 수로 친다고 가정하는 조건이 있다.

한 마리도 배치하지 않았을 경우(X), 왼쪽에 배치할 경우(L), 오른쪽에 배치할 경우(R)를 고려한 (n+1)x3의 배열을 생성하고, 아래의 점화식을 통해 해결할 수 있다.


1) i번째 행이 X일 경우, i-1번째 행은 X, L, R 모든 경우가 올 수 있으므로 이들의 합을 넘겨준다.

2) i번째 행이 L일 경우, i-1번째 행은 X, R의 경우가 올 수 있으므로 이들의 합을 넘겨준다.

3) i번째 행이 R일 경우는 반대로, i-1번째 행은 X, L의 경우가 올 수 있으므로 이들의 합을 넘겨준다.

 

 

코드

import sys

input = sys.stdin.readline
n = int(input())
dp = [[0] * 3 for _ in range(n + 1)]
dp[1] = [1, 1, 1]  # X, L, R
for i in range(2, n + 1):
    dp[i][0] = sum(dp[i - 1]) % 9901
    dp[i][1] = (dp[i - 1][0] + dp[i - 1][2]) % 9901
    dp[i][2] = (dp[i - 1][0] + dp[i - 1][1]) % 9901
print(sum(dp[n]) % 9901)

     

 

 

'코딩테스트' 카테고리의 다른 글

[Python] 기타줄 - 백준 (DP, 그리디)  (0) 2023.08.10
[Python] 최대 힙 - 백준  (0) 2023.06.16
[Python] Z - 백준 (분할정복)  (0) 2023.05.10
[Python] 한 줄로 서기 - 백준  (0) 2023.05.09
[Python] 로또 - 백준  (0) 2023.05.08
Comments