BOJ
[BOJ] 11726 2xn 타일링
rubato.dev
2025. 7. 16. 13:11
📌 문제 제목
문제 링크: BOJ 11726
🗒️ 문제 설명
2xn 크기의 직사각형을 1x2, 2x1 타일로 채우는 방법의 수를 구하는 프로그램
2xn 크기의 직사각형을 채우는 방법의 수를 10,007로 나눈 나머지를 출력
시간 제한: 1초
메모리 제한: 256MB
1 <= n <= 1,000
💡 문제 해결 아이디어
- 테이블 정의
- dp[i]는 2xi 크기의 직사각형을 채우는 방법의 수
- 점화식 찾기
- 2xi 크기의 직사각형이 있을 때, 왼쪽 위를 2x1 크기의 직사각형으로 채우는 경우
- 2xi 크기의 직사각형이 있을 때, 왼쪽 위를 1x2 크기의 직사각형으로 채우는 경우
- ※ dp[i] = dp[i-1] + dp[i-2]
- 초기값 정하기
- dp[1] = 1, dp[2] = 2
⌛️ 시간 복잡도
- O(N)
✅ 최종 코드
import sys
input = sys.stdin.readline
n = int(input().strip())
if n == 1:
print(1)
elif n == 2:
print(2)
else:
dp = [-1] * (n+1)
dp[1] = 1
dp[2] = 2
for i in range(3, n+1):
dp[i] = (dp[i-1] + dp[i-2]) % 10_007
print(dp[n])
# 공간복잡도를 O(1)로 줄일 수 있다.
import sys
input = sys.stdin.readline
n = int(input().strip())
if n == 1:
print(1)
elif n == 2:
print(2)
else:
a, b = 1, 2 # a = dp[i-2], b = dp[i-1]
for _ in range(3, n + 1):
a, b = b, (a + b) % 10_007
print(b)