📕문제
어떤 동물원에 가로로 두 칸 세로로 N칸인 아래와 같은 우리가 있다.
이 동물원에는 사자들이 살고 있는데 사자들을 우리에 가둘 때, 가로로도 세로로도 붙어 있게 배치할 수는 없다. 이 동물원 조련사는 사자들의 배치 문제 때문에 골머리를 앓고 있다.
동물원 조련사의 머리가 아프지 않도록 우리가 2*N 배열에 사자를 배치하는 경우의 수가 몇 가지인지를 알아내는 프로그램을 작성해 주도록 하자. 사자를 한 마리도 배치하지 않는 경우도 하나의 경우의 수로 친다고 가정한다.
📕입력
첫째 줄에 우리의 크기 N(1≤N≤100,000)이 주어진다.
📕출력
첫째 줄에 사자를 배치하는 경우의 수를 9901로 나눈 나머지를 출력하여라.
🔎문제해석
우선 나는 손으로 할 수 있는 예시까지는 손으로 계산해서 경우의 수를 계산했다.
DP [1]=3
DP [2]=7
DP [3]=17
DP [4]=41
이라는 결과가 나왔다.
솔직하게 조금 야매로 풀긴 했는데 그냥 DP [i]= DP [i-1]*2+DP [i-2]라는 규칙이 보였다.
지금도 왜 이런 규칙이 성립하는지는 잘 모르겠다... 알면 가르쳐 주실 분 댓글 좀 부탁드립니다.
💻코드
/*
백준 실버1 동물원
세로의 칸 수가 늘어나도 그 이전의 칸 수의 경우를 계쏙 포함해야함.
*/
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
vector<int>DP;
int n;
int main(){
cin>>n;
DP.resize(n+1,0);
DP[1]=3;
DP[2]=7;
for(int i=3; i<=n;i++){
DP[i]=(DP[i-1]*2+DP[i-2])%9901;
}
cout<<DP[n];
}
'CodingTest > Baekjoon' 카테고리의 다른 글
[백준 2281] 데스노트(C++) (0) | 2022.09.08 |
---|---|
[백준 2156] 포도주 시식(C++) (0) | 2022.09.06 |
[백준 9657] 돌 게임 3(C++) (0) | 2022.09.03 |
[백준 5904] Moo 게임(C++) (0) | 2022.08.29 |
[백준 1802] 종이접기(C++) (0) | 2022.08.28 |