Algorithm/백준 알고리즘

백준_1309 동물원(자바) / DP

미스터로즈 2021. 5. 13. 08:37

시간 & 메모리 제한

문제

입력 & 출력

DP를 이용한 문제풀이

package com.Back;

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

public class Back_1309 {

	public static void main(String[] args) throws NumberFormatException, IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		int N = Integer.parseInt(br.readLine());
		int[][] dp = new int[N + 1][3];
		dp[1][0] = 1;
		dp[1][1] = 1;
		dp[1][2] = 1;
		for (int i = 2; i <= N; i++) {
			dp[i][0] = (dp[i - 1][0] + dp[i - 1][1] + dp[i - 1][2])%9901;
			dp[i][1] = (dp[i - 1][0] + dp[i - 1][2])%9901;
			dp[i][2] = (dp[i - 1][0] + dp[i - 1][1])%9901;
		}
		System.out.println((dp[N][0]+dp[N][1]+dp[N][2])%9901);
	}
}

- 이 문제는 DP를 이용해서 문제를 해결했습니다.

 

- 배치를 할 수 있냐 없냐를 가지고 DP에 대한 점화식을 짜주면 됩니다.

 

- dp[k][0]은 한 라인에 아무 사자도 두지 않는 경우입니다. 

 

- dp[k][1]은 한 라인에 오른쪽에 두는 경우입니다. 

 

- dp[k][2]은 한 라인에 왼쪽에 두는 경우입니다.

 

- 맨 처음에는 모두 다 가능 하니까 1로 설정을 해줍니다.

 

- 그 후에 for문을 돌리는데 윗 칸에 사자가 없는 경우는 3가지 모두 가능합니다.

 

- 윗칸이 오른쪽에만 있는 경우는 왼쪽에 배치하는 선택을 , 왼쪽에만 있는 경우는 오른쪽에 배치하는 선택을 해주면 됩니다.