Notice
Recent Posts
Recent Comments
Link
«   2025/07   »
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
Archives
Today
Total
관리 메뉴

Mintaka's log

백준 11726 본문

알고리즘

백준 11726

_해랑 2022. 12. 12. 16:00

피보나치라는 것만 알면 간단!

 

그런데 피보나치라는 걸 몰라서 헤맸다.....


s(n) 을 2xn 크기의 직사각형을 채우는 방법의 수라고 정의하면,

s(n-1)의 형태에다가 오른쪽에 1x2 타일을 붙이는 경우가 포함되는 걸 알 수 있다.

따라서 s(n) = s(n-1) + ?

 

이 때 ?의 형태들을 잘 보면, 2x1 타일이 두개 붙은 것이 가장 오른쪽에 들어가있다.

즉, s(n-1)에서 1x2 타일이 항상 가장 오른쪽을 차지하고 있었다면

나머지 경우의 수들은 2x1 타일이 항상 가장 오른쪽을 차지하고 있다.

즉, ? = s(n-2).

 

따라서 s(n) = s(n-1) + s(n-2)

 

어차피 n이 되기 전 모든 값들을 계산해야 할테니 memoization을 해도 생략할만한 계산이 없다.

따라서 tabulation을 사용해서 코드 짬.

 

==>그리고 10007은 소수라서 나머지 값을 dp에 저장해도 연산에 차이는 없다!

 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Baekjoon_11726 {
	
	public static void main(String[] args) throws NumberFormatException, IOException {
				
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		int num = Integer.parseInt(br.readLine());
		
		int[] dp = new int[1001];
			//여기서 num+1로 주면 ArrayIndexOutOfBounds
		dp[1] = 1;
		dp[2] = 2;
		for(int i = 3; i <= num; i++) {
			dp[i] = (dp[i-1] + dp[i-2])%10007;
		}
		
		System.out.println(dp[num]);
	}
}

주의할 점은 dp의 길이를 num+1로 했다가는 dp[2] = 2 때문에 ArrayIndexOutOfBoundds에 걸린다는것! 

'알고리즘' 카테고리의 다른 글

[Algorithm] 브루트 포스 Brute force  (0) 2023.01.03
유클리드 호제법 Euclidean Algorithm  (0) 2022.12.28
백준 1463  (0) 2022.12.11
[백준] 10991- 아니 왜 안됨?-해결!  (0) 2022.05.24
[백준] 10818  (0) 2022.05.17