일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
Tags
- 프로그래머스
- SQL
- 백트래킹
- Stack
- 탐색
- 다이나믹프로그래밍
- 구현
- 배열
- 새벽코딩
- 그리디
- oracle
- 시뮬레이션
- dfs
- 알고리즘
- HashMap
- BufferedReader
- 빅데이터
- Java
- 브루트포스
- 문자열
- Python
- 아스키코드
- LIS
- 완전탐색
- 스택
- DP
- 백준
- 다리 만들기
- Queue
- BFS
Archives
- Today
- Total
새벽코딩
[백준] [11726] 2×n 타일링 (dp) (JAVA) 본문
반응형
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로 나눈 나머지를 배열에 담으면서 반복문을 진행해 나가야한다.
-새벽코딩-
반응형
'알고리즘' 카테고리의 다른 글
[백준] [2636] 치즈 (BFS) (JAVA) (2) | 2023.01.09 |
---|---|
[백준] [2852] NBA농구 (문자열) (JAVA) (2) | 2023.01.09 |
[백준] [14442] 벽 부수고 이동하기2 (BFS) (JAVA) (0) | 2023.01.06 |
[백준] [4889] 안정적인 문자열 (stack) (JAVA) (0) | 2023.01.05 |
[백준] [2206] 벽 부수고 이동하기 (BFS) (JAVA) (0) | 2023.01.04 |
Comments