백준 1563 - 개근상
Updated:
Java
1563 번 - 개근상
문제
접근 방법
탑다운 방식으로 해결한다.
아무것도 없는 빈 문자열에서부터 ‘o’, ‘a’, ‘l’을 하나씩 붙힌다고 가정하고 DFS를 호출한다.
‘a’의 경우 3개 연속되지 않도록, ‘l’의 경우는 2개 이상 나타나지 않도록 조건을 두어 Top-down 을 만든다.
day 일일때 l이 lCnt만큼 반복되었고 A가 ACnt만큼 연속되어 있을 때 dp로 두어 불필요한 반복을 방지한다.
dp[day][lCnt][ACnt]
코드
import java.util.*;
import java.io.*;
public class Main {
	static int n, result;
	static int[][][] dp;
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    	StringTokenizer stk;
    	n = stoi(br.readLine());
    	dp = new int[n + 1][2][3];
    	System.out.println(DFS(1,0,0));
    	br.close();
	}
	// dfs 시작
	private static int DFS(int day, int lCnt, int ACnt) {
		if(lCnt == 2 || ACnt == 3)
			return 0;
		if(day > n)
			return 1;
		// 한번 방문하였을 시, 다시 방문하지 않도록 한다.
		if(dp[day][lCnt][ACnt] != 0) {
			return dp[day][lCnt][ACnt];
		}
		// top-down 방식으로 합친다.
		//
		int sum = (DFS(day + 1, lCnt, 0) + DFS(day + 1, lCnt + 1, 0) + DFS(day + 1, lCnt, ACnt + 1)) % 1000000;
		dp[day][lCnt][ACnt] = sum;
		return sum;
	}
	static int stoi(String str) {
    	return Integer.parseInt(str);
    }
}
