제육's 휘발성 코딩
반응형

https://www.acmicpc.net/problem/15990

image
  • 같은 수가 연속으로 나오면 안되므로 2차원 배열(n값, 마지막에 더해진 숫자)을 사용해서 분리 시켜 준다. dp[4]의 경우를 예시로 보자.
    dp[4] [1] : 즉 마지막에 1을 더해서 4를 만들 경우는 dp[3]이 2 또는 3을 더해서 나온 결과여야한다.
    이를 점화식으로 표현하면 다음과 같다.

    dp[n][1] = dp[n-1][2] + dp[n-1][3]
    dp[n][2] = dp[n-2][1] + dp[n-2][3]
    dp[n][3] = dp[n-3][1] + dp[n-3][2]
  • dp[1], dp[2] 는 자기 자신만 존재하므로 dp[1] [1] = 1, dp[2] [2] =1
    dp[3]은 1+2, 2+1, 3 이 존재하므로 dp[3] [1], dp[3] [2], dp[3] [3] = 1 이 점화식의 시작이 된다.

코드

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

public class Main {
    static final int DIV = 1_000_000_009;
    static long[][] dp = new long[100001][4];
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sb = new StringBuilder();
        chkArray();
        int num = Integer.parseInt(br.readLine());
        while (num-- > 0) {
            int n = Integer.parseInt(br.readLine());
            sb.append(chk(n)).append("\n");
        }
        System.out.println(sb);
    }

    private static long chk(int n) {
        return (dp[n][1] + dp[n][2] + dp[n][3]) % DIV;
    }

    private static void chkArray() {
        dp[1][1] = 1;
        dp[2][2] = 1;
        dp[3][1] = dp[3][2] = dp[3][3] = 1;
        for (int i=4; i<dp.length; i++) {
            dp[i][1] = (dp[i-1][2] + dp[i-1][3]) % DIV;
            dp[i][2] = (dp[i-2][1] + dp[i-2][3]) % DIV;
            dp[i][3] = (dp[i-3][1] + dp[i-3][2]) % DIV;
        }
    }
}
반응형
profile

제육's 휘발성 코딩

@sasca37

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요! 맞구독은 언제나 환영입니다^^