문제 한눈에 보기
| 목표 | 길이 n인 01타일 수열의 개수 구하기 |
| 핵심 개념 | DP, 점화식, 나머지 연산 |
| 점화식 | dp[i] = dp[i-1] + dp[i-2] |
| 주의 | 매 계산마다 15746으로 나눈 나머지를 저장해야 한다. |
핵심 1
맨 뒤가 1로 끝나면 길이 i-1 문제로 연결된다.
핵심 2
맨 뒤가 00으로 끝나면 길이 i-2 문제로 연결된다.
핵심 3
그래서 결국 피보나치 형태 점화식이 나온다.
최종 코드
n = int(input())
def tile(n):
if n == 1:
return 1
if n == 2:
return 2
dp = [0] * (n + 1)
dp[1] = 1
dp[2] = 2
for i in range(3, n + 1):
dp[i] = (dp[i - 1] + dp[i - 2]) % 15746
return dp[n]
print(tile(n))
주의할 점
제공한 초안 코드에서는 반복문이
range(4, n+1) 로 시작했는데, 이렇게 하면 dp[3] 이 계산되지 않아 값이 틀어진다. 반드시 3부터 시작해야 한다.한 줄씩 설명
| 줄 | 코드 | 설명 |
|---|---|---|
| 1 | n = int(input()) |
길이 n 입력. |
| 3-7 | if n == 1: return 1 |
초기값 처리. |
| 9-11 | dp = [0] * (n + 1) |
DP 배열 생성과 시작값 설정. |
| 13-14 | for i in range(3, n + 1): |
작은 값부터 큰 값까지 차례대로 계산한다. |
| 16 | return dp[n] |
정답 반환. |
왜 점화식이 성립할까?
길이 i 타일 수열은 마지막이 1 로 끝나거나 00 으로 끝난다. 앞부분은 각각 길이 i-1, i-2 문제와 같으므로 두 경우를 더하면 된다.
한 문장 정리
01타일은 피보나치 형태 점화식을 이용하는 전형적인 DP 문제이며, 반복문을 3부터 시작하는 것이 중요하다.
'크래프톤 정글 > 정글에서 문제풀기' 카테고리의 다른 글
| [정글 알고리즘] - [하] 백준11047- 동전 0- 실버4 (0) | 2026.03.28 |
|---|---|
| [정글 알고리즘] - [하] 백준1541- 잃어버린 괄호- 실버2 (0) | 2026.03.28 |
| [정글 알고리즘] - [하] 백준2748- 피보나치 수 2- 브론즈1 (0) | 2026.03.28 |
| [정글 베이직29]그리디 - 회의실 배정 (0) | 2026.03.28 |
| [정글 베이직28]그리디 알고리즘 - 거스름돈 (0) | 2026.03.28 |