2133번: 타일 채우기
3×N 크기의 벽을 2×1, 1×2 크기의 타일로 채우는 경우의 수를 구해보자.
www.acmicpc.net
문제
3×N 크기의 벽을 2×1, 1×2 크기의 타일로 채우는 경우의 수를 구해보자.
입력
첫째 줄에 N(1 ≤ N ≤ 30)이 주어진다.
출력
첫째 줄에 경우의 수를 출력한다.
예제 입력 1 복사
2
예제 출력 1 복사
3
힌트
아래 그림은 3×12 벽을 타일로 채운 예시이다.
풀이 1. (틀린 코드)
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
int[] dp = new int[n+1];
dp[0] = 1;
dp[1] = 0;
for(int i = 2; i <= n; i++) {
if(i == 2) {
dp[i] = 3;
continue;
}
if(i % 2 == 1) {
dp[i] = 0;
continue;
}
dp[i] = dp[i-2] * 3 + dp[i-4] * 2;
}
System.out.println(dp[n]);
}
}
일단 n이 홀수인 경우는 절대로 타일을 다 채울 수 없다.
i = 2, 3 일 때는 조건문으로 따로 처리하고 4부터 반복이 제대로 돌게 했다.
i 번째로 올 수 있는 경우가 i-2, i-4 두 가지 경우만 있을 거라고 생각했는데, 이게 잘못된 생각이었다.
거의 다 온 거였는데.. 아쉽다.
풀이 2. (정답 코드)
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
int[] dp = new int[n+1];
dp[0] = 1;
dp[1] = 0;
for(int i = 2; i <= n; i++) {
dp[i] = dp[i-2] * 3;
for(int j = i - 4; j >= 0; j-=2) {
dp[i] += dp[j] * 2;
}
}
System.out.println(dp[n]);
}
}
i 번째에 도달할 수 있는 경우
1. i-2번째에서 3가지 경우 존재
2. i-4 부터 -2씩 반복하며 0이 될 때까지 2가지씩 계속 존재
'알고리즘 문제 > 백준 온라인 저지' 카테고리의 다른 글
[BOJ] 2225 - 합분해 JAVA (0) | 2021.01.13 |
---|---|
[BOJ] 9461 - 파도반 수열 JAVA (0) | 2021.01.13 |
[BOJ] 1699 - 제곱수의 합 JAVA (0) | 2021.01.12 |
[BOJ] 2579 - 계단 오르기 JAVA (0) | 2021.01.12 |
[BOJ] 1912 - 연속합 JAVA (0) | 2021.01.12 |