https://www.acmicpc.net/problem/11726
11726번: 2×n 타일링
2×n 크기의 직사각형을 1×2, 2×1 타일로 채우는 방법의 수를 구하는 프로그램을 작성하시오. 아래 그림은 2×5 크기의 직사각형을 채운 한 가지 방법의 예이다.
www.acmicpc.net
2 x n 직사각형을 그림으로 그려보면, n=2일때 2개, n=3일때 3개, n=4일때 5개 .. 이런식으로 진행된다.
2 x n 직사각형은 2 x (n-1) 직사각형의 수와 2 x (n-2) 직사각형의 수를 합한 수와 같다. 피보나치 배열 형식으로 횟수가 더해진다.
피보나치 배열은 수가 커지다보면 범위가 초과되어 제대로된 결과가 출력되지 않는다. 그래서 문제에 제시된 10007으로 나눈 나머지를 출력한다.
왜 굳이 10007을 나누는가 궁금했는데, 10007은 1000보다 큰 소수 중 하나로 큰수를 표현하기 어려울때 나머지로 답이 맞는지 판단하기 위해 나누어주는 수라고 한다.
코드
//11726
#include <iostream>
#include <cstring>
using namespace std;
#define SIZE 1001
int main(int argc, const char * argv[]) {
int num;
int rec[SIZE];
memset(rec, 0, sizeof(int)*SIZE);
cin>>num;
rec[0] = 1;
rec[1] = 1;
for(int i=2;i<=SIZE;i++){
rec[i] = ( rec[i-1]+rec[i-2] ) % 10007 ;
}
cout<<rec[num] ;
return 0;
}
'코딩테스트 연습 > Baekjoon' 카테고리의 다른 글
[Baekjoon] 1309번: 동물원 / dynamic (0) | 2022.03.31 |
---|---|
[Baekjoon] 11727번: 2xn 타일링 2 / dynamic (0) | 2022.03.31 |
[Baekjoon] 1149번: RGB거리 / dynamic (0) | 2022.03.31 |
[Baekjoon] 11057번: 오르막 수 / dynamic (0) | 2022.03.31 |
[Baekjoon] 11053번: 가장 긴 증가하는 부분 수열 / dynamic (0) | 2022.03.31 |