문제

2×n 직사각형을 1×2, 2×1과 2×2 타일로 채우는 방법의 수를 구하는 프로그램을 작성하시오.

아래 그림은 2×17 직사각형을 채운 한가지 예이다.

입력

첫째 줄에 n이 주어진다. (1 ≤ n ≤ 1,000)

출력

첫째 줄에 2×n 크기의 직사각형을 채우는 방법의 수를 10,007로 나눈 나머지를 출력한다.

내가 푼 풀이

- n = 1 -> 1, n = 2 -> 3

- n = i 일때, 직사각형을 채울수 있는 방법은 3가지이다.

dp[i]는 2 x i 까지 채울수있는 직사각형의 경우의 수라고 한다면

 

1) i-1 까지 놓을 수 있는 경우의 수 + 2x1 타일을 놓는것 : dp[i-1]

i - 1  2x1

2) i-2 까지 놓을 수 있는 경우의 수 + 2x2 타일을 놓는것 : dp[i-2]

i - 2 2x2

3) i-2 까지 놓을 수 있는 경우의 수 + 2x2타일을 놓아 반으로 나눈 1x2타일 두개를 놓는것 : dp[i-2]

i - 2 1x2
1x2

---> dp[i] = dp[i-1] + dp[i-2] + dp[i-2] 가 된다.

 

import Foundation

let count = Int(String(readLine()!))!
var dp = Array(repeating: 0, count: count+1)
dp[1] = 1

if count == 1 {
    print(dp[1])
} else {
    dp[2] = 3
    if count == 2 {
        print(dp[2])
    } else {
        for i in 3...count {
            dp[i] = (dp[i-1] + (2 * dp[i-2])) % 10007
        }
        print(dp[count])
    }
}

 

'코딩테스트 > 백준' 카테고리의 다른 글

BOJ-1010 다리놓기 Swift  (0) 2023.04.21
BOJ-10844 쉬운 계단 수 Swift  (0) 2023.04.19
BOJ-2156 포도주 시식 Swift  (0) 2023.04.19
BOJ-9461 파도반 수열 Swift  (1) 2023.04.19
BOJ-1912 연속합 Swift  (0) 2023.04.19

+ Recent posts