새벽코딩

[백준] [11726] 2×n 타일링 (dp) (JAVA) 본문

알고리즘

[백준] [11726] 2×n 타일링 (dp) (JAVA)

J 코딩 2023. 1. 8. 23:40
반응형

https://www.acmicpc.net/problem/11726

 

11726번: 2×n 타일링

2×n 크기의 직사각형을 1×2, 2×1 타일로 채우는 방법의 수를 구하는 프로그램을 작성하시오. 아래 그림은 2×5 크기의 직사각형을 채운 한 가지 방법의 예이다.

www.acmicpc.net


문제

2×n 크기의 직사각형을 1×2, 2×1 타일로 채우는 방법의 수를 구하는 프로그램을 작성하시오.

아래 그림은 2×5 크기의 직사각형을 채운 한 가지 방법의 예이다.

입력

첫째 줄에 n이 주어진다. (1 ≤ n ≤ 1,000)

 

출력

첫째 줄에 2×n 크기의 직사각형을 채우는 방법의 수를 10,007로 나눈 나머지를 출력한다.

예제 입력 1 복사

2

예제 출력 1 복사

2

예제 입력 2 복사

9

예제 출력 2 복사

55

※ JAVA 코드 (2×n 타일링)

import java.io.*;

public class Main {
	
	static int[] dp = new int[1001];
	
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		dp[1] = 1;
		dp[2] = 2;
		
		int n = Integer.parseInt(br.readLine());
		
		for(int i = 3; i <= n; i++) {
			dp[i] = (dp[i-2] % 10007 + dp[i-1] % 10007) % 10007;
		}
		System.out.println(dp[n]);
	}
}

※ 생각정리 (2×n 타일링)

dp(다이나믹 프로그래밍) 문제는 대부분 코드는 간단하지만 생각을 해서 패턴을 찾아내는 문제들이다.

 

 

패턴을 찾기 위해 다음과 같이 그림을 그려가며 문제에 접근하였다.

dp[n] = dp[n-2] + (1x2 타일링) + dp[n-1] + (2x1 타일링)의 패턴이 존재한다.

예를 들어 2 x 5 크기 타일을 채우려면 2 x 4 타일을 채웠던 경우의수에 2 x 3 타일을 채웠던 경우의 수를 더하면 된다. 수식은 dp[n] = dp[n-2] + dp[n-1]

하지만 다음과 같은 패턴으로 문제에서 주어진 범위 1000까지 가면 그 수가 너무 커지기 때문에 중간에 10007로 나눈 나머지를 배열에 담으면서 반복문을 진행해 나가야한다.

-새벽코딩-

반응형
Comments