728x90

문제

 

 

접근 방식

강의에서 설명해 주기 전까진 DP 문제일 줄은 생각도 못하고 있던 문제다...

 

 

일단 위와 같은 타일을 채워야 할 때

가장 위의 칸부터 채우는 경우를 살펴 보면

 

 

2*1 타일은 이렇게 하나를 둘 수 있는데

 

 

그러면 정확히 2*(n-1) 칸이 남게 된다.

 

 

1*2 타일의 경우에는 어차피 한 층에 1*2 타일을 쌓으면

다른 한 층도 무조건 1*2 타일을 쌓을 수밖에 없으니

2*(n-2) 칸이 남게 된다.

 

 

결국 이 한 칸에 올 수 있는 경우의 수는 (n-1) + (n-2)에 해당한다.

 

눈치가 빠른 사람은 이 공식을 어디서 많이 봤다고 생각할 수도 있는데

피보나치수열과 똑같은 공식이다.

 

이제 문제를 풀 수 있는 식은 구했으니

DP 테이블을 만들어야 하는데

간단하게 i일 때 경우의 수를 저장할 DP [N]으로 만들어주면 된다.

 

테이블의 초기값은 1일 때는 1, 2일 때는 2로 지정해 준 뒤에

3부터 반복문을 돌면서 DP [i-1] + DP [i-2]를 구한 후에

문제에서 요구한 대로 10007로 나눠 주면 된다.

 

풀이

public class Main {

	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

		int n = Integer.parseInt(br.readLine());

		if (n == 1) {
			System.out.println(1);
			return;
		}

		int[] dp = new int[n + 1];

		dp[1] = 1;
		dp[2] = 2;

		for (int i = 3; i <= n; i++) {
			dp[i] = (dp[i-1] + dp[i-2]) % 10007;
		}

		System.out.println(dp[n]);
	}
}

 

'Java > Algorithms' 카테고리의 다른 글

[백준] 11659번 : 구간 합 구하기 4  (0) 2023.12.18
[백준] 11727번 : 2×n 타일링 2  (1) 2023.12.18
[백준] 1149번 : RGB거리  (1) 2023.12.17
[백준] 20922번 : 겹치는 건 싫어  (1) 2023.12.17
[백준] 2531번 : 회전 초밥  (1) 2023.12.17

+ Recent posts