본문 바로가기

BOJ 문제풀이

#11727 2xn 타일링 2

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

 

11727번: 2×n 타일링 2

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

www.acmicpc.net

실버 3의 문제이다. dp문제답게 실버3치고는 어려웠던, 하지만 그나마 쉽게 풀수 있었던 문제이다.

#include <iostream>
#include <algorithm>
#define mod 10007
using namespace std;

int n;
long long dp[1001];

int main()
{
  //freopen("input.txt","r",stdin);
  cin>>n;
  dp[1]=1;
  dp[2]=3;

  for(int i=3;i<=n;i++){
    dp[i]=(dp[i-1]+dp[i-2]+dp[i-2])%mod;
  }

  cout<<dp[n]%mod;
}

코드는 굉장히 단순하다. 일단 문제에서 n의 최대값으로 1000을 주었고 이는 굉장히 큰 수가 될것임을 알아차리고 dp배열은 long long 형으로 설정해주었다.

 

이문제는 마지막 타일을 두지않을때 어떻게 되는지를 중심으로 점화식을 구성하면 된다.

dp[n] 을 2xn 타일을 채우는 방법의 수라고 하였을때, 마지막 타일을 두지않는 방법 3가지를 따져보면 된다.

첫째로, 1x2타일을 두지 않았을때 타일을 둔 부분은 dp[n-2]가 된다.

둘째로, 2x1타일을 두지 않았을때 타일을 둔 부분은 dp[n-1]가 된다.

마지막으로, 2x2타일을 두지 않았을때 타일을 둔 부분은 dp[n-2] 가 된다.

 

결론적으로 dp[n] = dp[n-1] + dp[n-2] + dp[n-2] 가 되는 것이다.

또, 계산시 나오는 수가 굉장히 클 수 있기때문에 계산을 할때마다 mod로 나누어주어 dp배열에 넣었다!

'BOJ 문제풀이' 카테고리의 다른 글

#1699 제곱수의 합  (0) 2022.04.29
#1149 RGB거리  (0) 2022.04.27
#2193 이친수  (0) 2022.04.18
#1912 연속합  (0) 2022.04.18
#13549 숨바꼭질 3  (0) 2022.04.18