반응형

www.acmicpc.net/problem/11727

 

11727번: 2×n 타일링 2

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

www.acmicpc.net

 

해결 방법 : 다이나믹 프로그래밍

  • 타일 길이가 1증가하여 총 길이가 n이 된 경우
    • 1. 해당 공간을 2 * 1타일 하나로 채우면 타일 길이가 n-1일때의 경우의 수와 같다.
    • 2. 그렇지 않으면 1 * 2타일 2개로 채우는 경우와 2 * 2타일로 채우는 경우, 총 2가지로 새로 생긴 부분(n)을 차지할 수 있다. 이 때는 타일 길이가 n-2일 때의 경우의 수와 새로 발생한 2가지 경우를 곱한 만큼의 경우의 수가 생긴다.
    • 점화식 : dp[n] = dp[n-1] + (dp[n-2] * 2)

 

import sys
input = sys.stdin.readline

def solution(n):
    d = [0 for i in range(0, n + 2)] # DP 테이블
    d[1], d[2] = 1, 3 # case 1, 2에 대한 초기값

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

    return d[n] % 10007

if __name__ == '__main__':
    n = int(input())
    result = solution(n)
    print(result)

 


 

 

www.acmicpc.net/problem/11726

 

11726번: 2×n 타일링

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

www.acmicpc.net

위 문제의 바로 이전 문제인 2 * n 타일링.

타일 길이가 1이 증가한 경우, 해당 위치를 2 * 1타일로 채운 경우는 동일,

외에는 1 * 2타일로 채우는 경우밖에 없으므로 

점화식이 dp[n] = dp[n-1] + dp[n-2]가 된다.

import sys
input = sys.stdin.readline

def solution(n):
    d = [0 for i in range(0, n + 2)]
    d[1], d[2] = 1, 2

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

    return d[n] % 10007

if __name__ == '__main__':
    n = int(input())
    result = solution(n)
    print(result)
반응형

'IT study > 알고리즘 문제 풀이' 카테고리의 다른 글

백준 2098 : 외판원 순회  (0) 2021.05.16
백준 2579 : 계단 오르기  (0) 2021.05.13
백준 1013 : Contact  (0) 2021.05.11
기둥과 보 설치*  (0) 2021.05.11
자물쇠와 열쇠*  (0) 2021.05.10

+ Recent posts