백준 - 11727

KangMyungJoe·2023년 8월 31일
0

algorithm

목록 보기
42/55

문제 설명

타일을 이용하여, 주어진 크기의 직사각형을 채울 수 있는 모든 경우의 수를 고려하는 문제다.


접근 방법

  1. 이러한 유형의 문제는 규칙을 찾아 답을 찾는 dynamic programming에 해당할 것 같아, 규칙 탐색
  2. 그 결과, 2*n 크기를 갖는 직사각형을 채움에 있어, n번째 블록은 n-2 블록에 사용된 타일 수 * 2와 n-1 블록에 사용된 타일 수가 필요
  3. 알아낸 규칙을 기반으로 코드 작성
  4. 2*1, 2*2, 2*3인 경우는 리스트 상에서 미리 정의

작성한 코드

import sys

input = sys.stdin.readline

n = int(input())

num_list = [0 for _ in range(1001)] # n이 최대 1000

num_list[0] = 1		# 2*1
num_list[1] = 3		# 2*2
num_list[2] = 5		# 2*3

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

print(num_list[n-1]%10007)

첫 시도에서 런타임 에러가 발생했는데,

num_list = [0 for _ in range(n+1)]

위와 같이 코드를 작성했을 때, 런타임 에러가 발생했다.

n이 1일 때 리스트 인덱스를 고려하지 못해 발생했다.
(코드에서 num_list[2] 범위까지 값을 할당하기 때문에)

이후 n의 최대 범위인 1000에 1을 더한 1001을 할당하여 문제를 해결했다.

profile
소통을 잘하는 개발자가 되고 싶습니다.

0개의 댓글