• 문제 링크
11726번: 2×n 타일링
2×n 크기의 직사각형을 1×2, 2×1 타일로 채우는 방법의 수를 구하는 프로그램을 작성하시오. 아래 그림은 2×5 크기의 직사각형을 채운 한 가지 방법의 예이다.
www.acmicpc.net
• 풀이 과정
문제에서 제시된 직사각형의 세로의 길이는 2로 고정되어 있으므로 가로의 길이만 고려하여 점화식을 구한다.
즉 n 을 1 또는 2의 합으로 나타내는 방법의 수를 구하는 문제로써 예시를 나타내면 아래와 같다.
2 = (1 + 1) (2), 3 = (1 + 1 + 1) (1 + 2) (2 + 1), 4 = (1 + 1 + 1 + 1) (1 + 1 + 2) (1 + 2 + 1) (2 + 1 + 1) (2 + 2)
이때 4를 만드는 경우의 수는 2의 모든 경우의 수에 2를 더한 것 + 3의 모든 경우의 수에 1를 더한 것이므로
이에 대한 점화식을 dp배열을 활용한 코드에 적용하면 dp[i] = dp[i - 1] + dp[i - 2] 이 성립한다.
추가로 ArrayIndexOutOfBounds 에러를 방지하기 위하여 dp[0] = dp[1] = 1 로 초기화,
자료형 오버플로우를 방지하기 위하여 각 dp 배열에 값을 저장할 때마다 % 10007 연산을 수행한다.
• 풀이 코드
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int n = Integer.parseInt(br.readLine());
int[] dp = new int[n + 1];
dp[0] = dp[1] = 1;
for (int i = 2; i < n + 1; i++)
dp[i] = (dp[i - 1] + dp[i - 2]) % 10007;
bw.write(dp[n] + "\n");
bw.flush();
}
}
'Problem Solving > Baekjoon' 카테고리의 다른 글
[백준] 11052 카드 구매하기 - Dynamic Programming / Java (0) | 2022.07.19 |
---|---|
[백준] 9095 1, 2, 3 더하기 - Dynamic Programming / Java (0) | 2022.07.18 |
[백준] 1463 1로 만들기 - Dynamic Programming / Java (0) | 2022.07.16 |
[백준] 2644 촌수계산 - Graph Theory / Java (0) | 2022.07.15 |
[백준] 11403 경로 찾기 - Graph Theory / Java (0) | 2022.07.14 |
댓글