지-코바

[지코바] 8회차 - 상수님의 2xn타일링

moonseok 2022. 6. 21. 23:59
 

11726번: 2×n 타일링

2×n 크기의 직사각형을 1×2, 2×1 타일로 채우는 방법의 수를 구하는 프로그램을 작성하시오. 아래 그림은 2×5 크기의 직사각형을 채운 한 가지 방법의 예이다.

www.acmicpc.net

 


 

 

  • 문제분석
    2xn 크기의 타일을 1x2, 2x1타일로 채우는 경우의 수를 구하는 문제이다.
    언뜻보기에는 어려워 보이지만 차례대로 경우의 수를 구하다보면 피보나치 수열을 이루는 것을 알 수 있다.

    n=1일 때, 1가지
    n=2일 때, 2가지
    n=3일 때, 3가지
    n=4일 때, 5가지
    n=5일 때, 8가지
    ····

    순으로 f(n) = f(n-1) + f(n-2)의 규칙을 보인다.
    따라서 n이 1,2인 경우를 제외하고 피보나치 수열을 이용하여 답을 구해주면 된다.

 

  • 상수님의 풀이
from sys import stdin

input = stdin.readline

tiling_method = []

n = int(input().rstrip())

for index in range(n+1):
  if index < 3:
    tiling_method.append(index)
  else:
    tiling_method.append(tiling_method[index-1] + tiling_method[index-2])

print(tiling_method[n] % 10007)

 


 

  • 풀이 분석
input = stdin.readline

tiling_method = []

n = int(input().rstrip())

※test case인 n만 입력받아도 되는데 readline을 통해 input을 입력받고 오른쪽 공백을 삭제하신 이유가 궁금했다.

n을 입력 받을 수 있도록 하고 피보나치 수열을 저장할 list를 생성해준다.

for index in range(n+1):
  if index < 3:
    tiling_method.append(index)
  else:
    tiling_method.append(tiling_method[index-1] + tiling_method[index-2])

print(tiling_method[n] % 10007)

index가 3보다 작은경우, n = 1, n = 2일때는 리스트에 1, 2를 append해주고 

3이상인 경우에는 앞서 말했던것처럼 피보나치 수열을 이용하여 각각 append해준다. 

그리고나서 문제에서 말했던 10007을 나눈 나머지를 출력해주는데 나는 이 문제를 풀 때 이걸 해주지 않아 분명 제대로 푼것 같은데 계속 오답이 떠서 헤맸던 기억이 있다....