728x90
https://www.acmicpc.net/problem/1309
DP를 사용
맨 위의 두 칸을 세 가지 경우로 나눈다
- 공백: 두 칸에 아무도 없음
- 좌: 왼쪽 칸에 사자 있음
- 우: 오른쪽 칸에 사자 있음
만약 n이 1이라면
위처럼 세 가지 경우가 있습니다
n이 2인 경우를 보겠습니다
그런데 아래 칸(파란색)의 경우의 수는
n=1일 때의 경우의 수와 같습니다
즉 맨 위의 두 칸이 공백이면 n-1의 모든 경우의 수가 올 수 있고,
왼쪽만 있으면 n-1의 경우의 수 중 공백과 오른쪽이 채워져 있는 경우가 올 수 있고,
오른쪽만 있으면 n-1의 경우의 수 중 공백과 왼쪽이 채워져 있는 경우가 올 수 있습니다.
dp 점화식으로 풀게 된다면
# 0번 째는 공백(사자 없음), 1번 째는 왼쪽에 사자, 2번 째는 오른쪽에 사자
dp[n] = [
dp[n-1][0] + dp[n-1][1] + dp[n-1][2],
dp[n-1][0] + dp[n-1][2],
dp[n-1][0] + dp[n-1][1]
]
그런데, 이 점화식은 지난 번의 값만 있으면 되기 때문에 식이 훨씬 간결해집니다.
import sys
input = sys.stdin.readline
n = int(input())
dp = [1, 1, 1] # 공백, 좌, 우
for _ in range(2, n+1):
dp = [
dp[0] + dp[1] + dp[2],
dp[0] + dp[2],
dp[0] + dp[1]
]
print(sum(dp)%9901)
'코딩테스트 문제' 카테고리의 다른 글
[백준/Python] 이진 검색 트리 (1) | 2024.10.17 |
---|---|
[Python/백준] 트리 순회 (1) | 2024.10.15 |
[백준/Python] 트리의 부모 찾기 (0) | 2024.10.14 |
[백준/Python] 특정한 최단 경로 (1) | 2024.10.09 |
[Python/백준] 운동 (1) | 2024.10.05 |