(C++) 백준 11726번 - 2xn타일링

코딩너구리·2025년 11월 1일

코딩 문제 풀이

목록 보기
61/266

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

문제

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

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

접근

DP를 사용해서 직사각형을 채우는 방법의 규칙을 찾아 크기가 커졌을 때의 경우의수를 구한다.

문제해결

> n에대해 1일 때 부터 가능한 경우를 모두 따져보았다.
1일 땐 2x1 짜리만 한개 올 수 있으므로 1가지, 2일 땐 1x2 2개, 2x1 2개 올 수 있으므로 2가지가 된다.
> 3일 땐 1x2 2개가 먼저오고 2x1이 붙고, 반대로 2x1에 1x2 두개가 붙고, 2x1 3개가 오는경우 해서 3가지이다.
4, 5도 이처럼 그림과 같다. 그래서 각가 5, 8가지이다.
> n에 따른 경우의 수를 분석해보면 1,2 일 때 제외하곤 각각 직전의 경우와 그 전의 경우의 합이다. 즉 식으로 쓰면 n = n-2 + n-1이 된다. 따라서 이 식을 적용해 dp[n]값을 구해준다.

코드

#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;

int main()
{
	ios::sync_with_stdio(false);
	cin.tie(nullptr);
	cout.tie(nullptr);

	int n;
	cin >> n;

	vector<int> dp(n+1);
	dp[1] = 1;
	dp[2] = 2;
	for (int i = 3; i <= n; i++) dp[i] = (dp[i - 2] + dp[i - 1]) % 10007;

	cout << dp[n] << '\n';
}

후기

규칙을 다 구하고 제출했는데 틀려서 식에 뭔가 예외가 있나 계속 그렸는데 문제가 없었다. 알고보니 문제에 10007로 나눈값을 출력하고 되어있었다.

0개의 댓글