[BOJ_Python] 1309.동물원
2024. 11. 23. 18:28ㆍ[Algorithm]/문제 풀이
문제
https://www.acmicpc.net/problem/1309
사용 알고리즘
DP
풀이
고려사항
1. 현재 위치에서 상하좌우에 사자가 존재하는지
2. 상하좌우에 사자가 존재하지 않는다면 사자를 놓을 것인지
후기
1. 이 문제의 keypoint는 점화식을 찾는 것이다.
우선 한 줄씩 늘려보면
n = 1인 경우 아래와 같은 방법으로 3가지 경우의 수가 존재한다.
n = 2인 경우
- 아무것도 없는 경우에 n = 1과 같이 3가지 경우
- 한 마리가 있는 경우에 사자를 놓지 않거나 반대편에 놓는 경우
즉, 2 * 2 = 4가지 경우의 수가 존재하므로
- 총 7가지 경우의 수가 존재한다.
이런 방법으로 점화식을 찾다보면
두 쪽 모두 비어 있는 경우 * 3 + 사자가 한 쪽에 존재하는 경우 * 2의 규칙을 발견할 수 있다.
- 두 쪽 모두 비어 있는 경우는 지금의 두 단계 전의 경우의 수와 같고
(두 단계 전의 경우의 수에 빈 우리만 붙인 경우)
- 사자가 한 쪽에 존재하는 경우는 한 단계 전의 경우의 수에서 두 단계 전의 경우의 수를 뺀 경우와 같다.
(한 단계 전에서 빈 우리만 뺀 경우)
때문에 아래와 같은 점화식을 찾을 수 있다.
dp[i] = dp[i-2] * 3 + ( dp[i-1] - dp[i-2] ) * 2
= dp[i-2] + dp[i-1] * 2
코드
N = int(input())
dp = [1,3] + [0]*(N-1)
for i in range(2,N+1):
dp[i] = (dp[i-2] + dp[i-1]*2)%9901
print(dp[N])
결과
'[Algorithm] > 문제 풀이' 카테고리의 다른 글
[BOJ_Python] 15649 ~ 15652. N과 M 시리즈 1 (1 ~ 4) (0) | 2024.11.25 |
---|---|
[BOJ_Python] 20500.Ezreal 여눈부터 가네 ㅈㅈ (0) | 2024.11.24 |
[BOJ_Python] 2110.공유기 설치 (0) | 2024.11.22 |
[BOJ_Python] 1654. 랜선 자르기 (1) | 2024.11.21 |
[BOJ_Python] 1920. 수 찾기 (2) | 2024.11.20 |