알고리즘/백준 문제 풀이
[BOJ] 2718. 타일 채우기
바켱서
2020. 7. 13. 22:17
https://www.acmicpc.net/problem/2718
접근 방법
그 전의 타일의 올 수 있는 경우에 대해 생각해봄.
그 전 타일이 올 수 있는 경우의 수는 총 5개가 나왔다.
1) 그 전의 타일이 다 채워져있는 경우 = 그 전의 타일이 하나도 채워져있지 않는 경우
2) 그 전의 타일이 밑에서 2개만 채워져있는 경우
3) 그 전의 타일이 가운데 2곳만 채워져있는 경우
4) 그 전의 타일이 위 아래 1곳씩 채워져 있는 경우
5) 그 전의 타일이 위의 2곳만 채워져있는 경우
위의 경우를 그림으로 표현을 해보았다.
여기서 왜
o
x
o
x 를 하지 않았냐고 물어본다면 모든 타일이 채워져야하기 때문에 불가능하다!
Need Know
- DP
전체 코드 ( Java )
import java.io.*;
class Main {
static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
static StringBuilder sb = new StringBuilder();
static int N;
static int T;
static int[][] cache;
public static void main(String[] args) throws IOException {
set();
System.out.print(sb);
br.close();
}
static void set() throws IOException {
T = Integer.parseInt(br.readLine());
for(int i=0; i<T; i++){
N = Integer.parseInt(br.readLine());
solve();
}
}
static void solve() throws IOException {
cache = new int[N+2][5]; //
cache[1][0] = 1;
for(int i=2; i<N+2; i++){
cache[i][0] = cache[i - 2][0] + cache[i - 1][0] + cache[i - 1][1] + cache[i - 1][4] + cache[i - 1][3]; // 빵꾸 X
cache[i][1] = cache[i - 1][0] + cache[i - 1][4]; // 위의 두개가 빵꾸
cache[i][2] = cache[i - 1][3]; // 맨위랑 맨 아래가 빵꾸
cache[i][3] = cache[i - 1][0] + cache[i - 1][2]; // 중간 두개가 빵꾸
cache[i][4] = cache[i - 1][0] + cache[i - 1][1]; // 밑에 두개가 빵꾸
}
sb.append(cache[N+1][0]+ "\n");
}
}