Algorithm (PS)
[백준] 1309 동물원 Python
minjiwoo
2022. 11. 23. 11:20
728x90
https://www.acmicpc.net/problem/1309
1309번: 동물원
첫째 줄에 우리의 크기 N(1≤N≤100,000)이 주어진다.
www.acmicpc.net
dp 는 3 * (n+1)의 공간으로 만들어 주었다.
사자를 배치하는 것에 대해 생각해보면 다음과 같은 세 가지 이다.
1. 사자를 배치하지 않는 경우
dp[i][0] = dp[i-1][0] + dp[i-1][1] + dp[i-1][2]
2. 사자를 왼쪽 칸에 배치하는 경우
사자를 연속해서 왼쪽 칸에 배치할 수 없으므로, 이전 계산 값 (dp[i-1])에서 오른쪽에 배치한 경우와 배치하지 않는 경우의 수를 가져온다.
dp[i][1] = dp[i-1][0] + dp[i-1][2]
3. 사자를 오른 쪽 칸에 배치하는 경우
사자를 연속해서 오른쪽 칸에 배치할 수 없으므로, 이전 계산 값 (dp[i-1])에서 왼쪽에 배치한 경우와 배치하지 않는 경우의 수를 가져온다.
dp[i][2] = dp[i-1][0] + dp[i-1][1]
전체 코드
n = int(input())
dp = [[0, 0, 0] for _ in range(n+1)]
dp[1][0] = 1 # 사자를 배치하지 않는 경우
dp[1][1] = 1 # 사지를 왼쪽에 배치
dp[1][2] = 1 # 사자를 오른쪽에 배치
for i in range(2, n+1):
dp[i][0] = (dp[i-1][0] + dp[i-1][1] + dp[i-1][2])%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)
728x90