문제
문제해결
- 1*2와 2*1의 직사각형으로 2*n을 만들 수 있는 경우의 수는 1, 2, 3, 5, 8....
- 2*3의 직사각형을 만들기 위해선
모든 2*2 직사각형에(dp[i-1]) 세로 타일 하나 추가 한 경우의 수
+
모든 2*1 직사각형에(dp[i-2]) 가로 타일 두개 추가한 경우의 수
즉 dp[i] = dp[i-1] + dp[i-2]
- 2*0을 제외하고 보면 피보나치 수열임을 알수있다
- 2*0일 경우를 임의로 1로 설정하면 피보나치 수열 해결 방식으로 문제 풀이가 가능하다
- 피보나치 수열의 경우 n이 증가함에 따라 값이 기하급수적으로 커지므로 10007이라는 값을 항상 나눠줘서 overflow가 안나게 한다
import java.util.Scanner;
//피보나치 수열
public class B11726 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
//dp 배열의 크기는 n+1
int[] dp = new int[n+1];
//0,1 은 1로 초기화
dp[0] = 1;
dp[1] = 1;
//2부터 dp[i] = dp[i-1] + dp[i-2]로 dp 배열 채우기
for (int i = 2; i <= n; i++) {
dp[i] = dp[i-1] + dp[i-2];
dp[i] %= 10007;//int에 담을 수 있게 10007로 나머지 연산 수행하는듯
}
//dp 배열의 n번째 수가 최대 만들 수 있는 횟수
System.out.println(dp[n]);
}
}
'[알고리즘] > 백준' 카테고리의 다른 글
백준 9095 자바 - 1, 2, 3 더하기 (0) | 2021.07.22 |
---|---|
백준 11727 자바 - 2*n 타일링2 (0) | 2021.07.21 |
백준 1463 자바 - 1로 만들기 (0) | 2021.07.19 |
백준 11653 자바 - 소인수분해 (0) | 2021.07.10 |
백준 2745 자바 - Base Conversion (0) | 2021.07.09 |