본문 바로가기

알고리즘/백준 문제풀기

BOJ 백준 11726 2xN 타일링

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

 

11726번: 2×n 타일링

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

www.acmicpc.net

문제 풀이 )

위의 사진을 볼 때 타일의 끝이 채워지는 방식은 위와 같이 두 가지 경우가 존재한다.

 

    1. 길이가 1이 남고 1x2 타일로 채워진 경우

 

    2. 길이가 2가 남고 2x1 타일 2개로 채워진 경우

 

타일의 끝에 길이가 3이 남는 경우는?

n = 3 타일

n이 3인 타일이 채워지는 방식은 위와 같이 3가지 경우가 존재한다.

 

채워지는 방식 중, 

 

    첫 번째는길이가 1 남고 1x2 타일로 채워지는 경우 에 해당한다.

 

    두 번째는 길이가 2가 남고 2x1 타일 2개로 채워진 경우 에 해당한다.

 

    세 번째는 1x2 타일 한 개와 2x1 타일 2개로 끝나는 것이 아니라, 

        길이가 1 남고 1x2 타일로 채워지는 경우 에 해당한다.

 

따라서 모든 타일의 끝은 위에서 말했던,

 

    1. 길이가 1이 남고 1x2 타일로 채워진 경우               => n - 1개의 타일을 채우는 방법의 수

 

    2. 길이가 2가 남고 2x1 타일 2개로 채워진 경우          => n - 2개의 타일을 채우는 방법의 수

 

이렇게 두 가지 방식으로만 끝난다. 따라서,

n개의 타일을 채우는 방식은 n-1개의 타일을 채우는 방법의 수와 n - 2개의 타일을 채우는 방법의 수의 합이 된다.

 

=> dp[n] = dp[n - 1] + dp[n - 2]

 

소스 코드

#include <cstdio>
#define MOD 10007

using namespace std;

const int SIZE = 1010;
int n;
int dp[SIZE] = { 0 };
int main()
{
	scanf("%d", &n);
	dp[0] = 1;
	dp[1] = 2;

	for (int i = 2; i < n; ++i)
		dp[i] = (dp[i - 1] + dp[i - 2]) % MOD;

	printf("%d\n", dp[n - 1]);
	return 0;
}

11727 2xN 타일링 2

https://onecoke.tistory.com/entry/BOJ-%EB%B0%B1%EC%A4%80-11727-2xN-%ED%83%80%EC%9D%BC%EB%A7%81-2

'알고리즘 > 백준 문제풀기' 카테고리의 다른 글

BOJ 백준 1793 타일링  (1) 2019.05.16
BOJ 백준 11727 2xN 타일링 2  (0) 2019.05.16
BOJ 백준 2573 빙산  (0) 2019.05.11
BOJ 백준 3055 탈출  (0) 2019.05.10
BOJ 백준 5014 스타트링크  (0) 2019.04.16