fragment-header
fragment-markdown
홈
로그인
로그아웃
내 블로그
설정
로그인
백준 14852 (C++) 타일 채우기 3
최초 업로드: 2025-04-30 14:15:17
최근 수정 시간: 2025-07-25 08:49:04
게시자: rlatjwls3333
카테고리: 백준
조회수: 7
# [Gold IV] 타일 채우기 3 [문제 링크](https://www.acmicpc.net/problem/14852) ## 문제 설명 <p>2×N 크기의 벽을 2×1, 1×2, 1×1 크기의 타일로 채우는 경우의 수를 구해보자.</p> ## 입력 <p>첫째 줄에 N(1 ≤ N ≤ 1,000,000)이 주어진다.</p> ## 출력 <p>첫째 줄에 경우의 수를 1,000,000,007로 나눈 나머지를 출력한다.</p> ## 풀이 #### dp[i][0]을 i까지 깔았을 때의 경우의 수로, dp[i][1]을 i까지의 경우의 수의 누적 합으로 두고 풀었다. 직접 손으로 그려보니 i의 경우의 수는 i-1의 경우의 수 * 2 + i-2의 경우의 수 * 3 + (0~i-3까지의 경우의 수) * 2 였다. ``` c++ #include<bits/stdc++.h> using namespace std; const long long MOD = 1e9+7; long long dp[1'000'001][2]; /** * dp[i][0] : i까지의 경우의 수 * dp[i][1] : 0~i까지의 경우의 수의 합 */ int main() { ios::sync_with_stdio(0); cin.tie(0); int n; cin >> n; dp[0][0]=dp[0][1]=1; for(int i=1;i<=n;i++) { dp[i][0] += dp[i-1][0]*2; if(i>=2) dp[i][0] += dp[i-2][0]*3; if(i>=3) dp[i][0] += dp[i-3][1]*2; dp[i][0] %= MOD; dp[i][1] = (dp[i-1][1]+dp[i][0])%MOD; } cout << dp[n][0]; } ```