일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
Tags
- 변수
- SQL
- 2156
- 데이터길이
- 동적계획법
- Algorithm
- 반복문
- n x 2 타일링 2
- 백준
- Eclipse
- select
- 입출력
- Dynamic Programming
- Database
- 문자열
- darkest dark
- 소숫점처리
- 10951
- algoritm
- oracle
- 그대로 출력하기
- 데이터베이스
- ANSI JOIN
- 자바
- DP
- 오라클
- 알고리즘
- db
- Java
- JOIN
Archives
- Today
- Total
Cracking Code
[동적계획법 (D.P.)] 백준 11727: 2 x N 타일링 2, Java 본문
Algorithms/동적계획법 (Dynamic Programming)
[동적계획법 (D.P.)] 백준 11727: 2 x N 타일링 2, Java
CrackCo 2020. 8. 8. 21:41
1. 접근
단순하게 생각했을 때 새로운 n번째 타일을 채울 때는 n - 1번째 타일들에
세로 직사각형 1개가 추가되는 것을 생각할 수 있었습니다.
나머지 경우의 수를 생각해보았을 때 방금 추가한 세로 직사각형이 중간에 들어갈 수 있기 때문에
상상만으로 접근하기에는 어려웠습니다.
2. 해결
그림을 그려 규칙을 찾아보는 것으로 하였습니다.
2 x 1
2 x 2
2 x 3
- 2 x 2 타일에 세로 직사각형 타일 추가
- 2 x 1 타일에 가로 두 개 타일, 정사각형 타일 추가
2 x 4
- 2 x 3 타일에 세로 직사각형 타일 추가
- 2 x 2 타일에 가로 두 개 타일, 정사각형 타일 추가
즉 n번째 타일의 경우의 수는
(n - 1번째 타일의 경우의 수) + (n - 2번째 타일의 경우의 수의 두 배)
3. 코드
import java.io.BufferedReader;
import java.io.InputStreamReader;
public class Main {
public static void main(String[] args) throws Exception {
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(bf.readLine());
int[] dp = new int[n + 1];
dp[0] = 1;
dp[1] = 1;
for (int i = 2; i <= n; i++) {
dp[i] = (dp[i - 1] + dp[i - 2] * 2) % 10007;
}
System.out.println(dp[n]);
}
}
'Algorithms > 동적계획법 (Dynamic Programming)' 카테고리의 다른 글
[동적계획법 (D.P.)] 백준 9465: 스티커, Java (0) | 2020.08.23 |
---|---|
[동적계획법 (D.P.)] 백준 2156: 포도주 시식, Java (0) | 2020.08.16 |
[동적계획법 (D.P.)] 백준 11057: 오르막 수, Java (0) | 2020.08.15 |
[동적계획법 (D.P.)] 백준 10844: 쉬운 계단 수, Java (0) | 2020.08.15 |
Comments