BOJ

백준 1793 - 타일링

yanJuicy 2021. 6. 19. 04:41
반응형

문제

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

 

1793번: 타일링

입력은 여러 개의 테스트 케이스로 이루어져 있다. 각 테스트 케이스는 한 줄로 이루어져 있으며, 숫자 0 ≤ n ≤ 250이 주어진다. 

www.acmicpc.net

 

 

풀이

 

사용할 수 있는 타일이 2 * 1(가로),  2 * 1 (세로), 2 * 2 세 종류이다.

왼쪽부터 차례대록 타일을 채운다고 생각하면서 점화식을 생각해본다.

길이가 i인 타일을 채워야 하고, i-1까지 타일이 채워져 있다면 2 * 1(세로)를 사용하면 된다.

길이가 i인 타일을 채워야 하고, i-2까지 타일이 채워져 있다면 2*1(가로) 두개를 사용하는 방법과 2*2 타일을 사용하는 방법이 있다.

 

따라서 다음과 같은 점화식을 만들 수 있다.

a[i] = a[i-1] + a[i-2] * 2 

 

문제에서 입력으로 가능한 수가 0도 포함되어 있어서 a[0]의 경우도 생각해야 하는데, 2*0의 직사각형은 아무것도 하지 않아도 이미 채워져 있다고 생각을 해서 1로 초기화 해준다. 

 

코드

python

1
2
3
4
5
6
7
8
9
10
11
12
13
= [0* 251
d[0= 1
d[1= 1
d[2= 3
for i in range(3251):
    d[i] = d[i - 1+ d[i - 2* 2
 
while True:
    try:
        n = int(input())
        print(d[n])
    except EOFError:
        break
cs

 

java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import java.math.BigInteger;
import java.util.Scanner;
 
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
 
        BigInteger[] d = new BigInteger[251];
        d[0= new BigInteger("1");
        d[1= new BigInteger("1");
        d[2= new BigInteger("3");
 
        for (int i=3; i<=250; i++) {
            d[i] = d[i-1].add(d[i-2].multiply(new BigInteger("2")));
        }
        
        while (sc.hasNext()) {
            System.out.println(d[sc.nextInt()]);
        }
 
    }
}
 
cs

 

반응형

'BOJ' 카테고리의 다른 글

백준 18352 - 특정 거리의 도시 찾기  (0) 2021.07.19
백준 1439 - 뒤집기  (0) 2021.07.18
백준 2805 - 나무 자르기  (0) 2021.06.18
백준 1260 - DFS와 BFS  (0) 2021.06.12
백준 17977 - Triangulation  (0) 2020.10.08