본문 바로가기

알고리즘/백준

[백준] 11726번 : 2xn 타일링

728x90

안녕하세요. 매일공부하는 개발자 빅광스입니다.

오늘은 다이나믹 프로그래밍의 문제를 풀어보도록 하겠습니다.

https://www.acmicpc.net/problem/11726

 

11726번: 2×n 타일링

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

www.acmicpc.net

문제

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

아래 그림은 2×5 크기의 직사각형을 채운 한 가지 방법의 예이다.

입력

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

출력

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

예제 입력 1 

2

예제 출력 1 

2

예제 입력 2 

9

예제 출력 2 

55

 

 

해당 문제는 점화식으로 문제를 해결 할 수 있습니다.

- 2*1 타일의 경우의 수는 1가지,  f(1) = 1

- 2*2 타일의 경우의 수는 2가지, f(2) = 2

- 2*3타일의 경우의 수는 f(3) = f(2)+f(1) 입니다.

- 2*3의 경우 f(1)에서 세로로된 타일 2개를 옆에 붙힙니다, f(2)에다가 가로로된 타일2개를 옆에 붙힙니다.

위의 사진과 같은 상황으로 f(3)은 만들어 집니다.

 

따라서 점화식을 f(n) = f(n-1) + f(n-2)로 만들 수 있습니다.

 

다음은 파이썬으로 코드를 작성해보겠습니다.

 

dp[1] 과 d[2]를 미리 값을 지정해준뒤 값을 계산하여 dp에 누적하여 계산해주고 값을 Return 해줍니다.

이렇게 하면 f(9), f(8)를 계산할때 쓰이는 서브프라블럼들을 미리 계산해두어 시간복잡도를 줄 일 수 있습니다.

n = int(input())

dp = [0] * (1000+1)
dp[1] = 1
dp[2] = 2
def f(n):
    if(dp[n] != 0):
        return dp[n] 
    else:
        dp[n] = f(n-1) + f(n-2)
        return dp[n]
        
print(f(n)%10007)

 

728x90

'알고리즘 > 백준' 카테고리의 다른 글

[백준] 3109번 : 빵집  (0) 2023.07.02
[백준] 1700번 : 멀티탭 스케줄링  (2) 2023.06.26
[백준] 2579번 : 계단오르기  (0) 2023.06.24
[백준] 1149번 : RGB거리  (0) 2023.06.22
[백준] 1339번 : 단어수학  (2) 2023.06.19