[BOJ] 11726: 2xn 타일링

이슬비·2022년 6월 21일
0

Algorithm

목록 보기
49/110
post-thumbnail

어김없이 다이나믹 프로그래밍.

11726: 2xn 타일링

1. 내 풀이 1: 실패(런타임 에러)

import sys

n = int(sys.stdin.readline())
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]

print(dp[n]%10007)

이 풀이를 내고 런타임 에러가 났다. Index 문제여서 최솟값, 최댓값을 한 번 비교해보았다. 1을 넣으니,

이와 같은 에러가 나타나는 것을 확인했다.
n=1일 때, len(dp) = 2 이므로 dp[2]가 없는 것이다. 그래서 n+2를 해줬다.

2. 내 풀이 2: 성공

import sys

n = int(sys.stdin.readline())
dp = [0] * (n+2)
dp[1] = 1
dp[2] = 2

for i in range(3, n+1):
    dp[i] = dp[i-1] + dp[i-2]

print(dp[n]%10007)

풀이에 대해서 소개하자면, 2*n에서 n에 따른 규칙을 발견했다.

  • n=1일 때, 방법의 개수: 1
  • n=2일 때, 방법의 개수: 2
  • n=3일 때, 방법의 개수: 3
  • n=4일 때, 방법의 개수: 5
  • n=5일 때, 방법의 개수: 8
  • n=6일 때, 방법의 개수: 13

이런 식으로 1과 2일 때를 제외하고는 모두 앞의 두 항의 값을 더한 값인 것이다. 마치 피보나치 수열 풀이와 굉장히 유사하다.

DP에 대해서 깨닫고 나니 문제 풀이가 훨씬 쉬워졌다! 오늘도 신기한 알고리즘의 세계 끝이다 ~!

profile
정말 알아?

0개의 댓글