[백준][15990번] 1,2,3 더하기 5

Updated:

문제 URL

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

다른 풀이

import java.util.*;
public class Main {
    static final long mod = 1000000009L;
    static final int limit = 100000;
    static long[][] d = new long[limit+1][4];
    public static void main(String args[]) {
        Scanner sc = new Scanner(System.in);
        for (int i=1; i<=limit; i++) {
            if (i-1 >= 0) {
                d[i][1] = d[i-1][2] + d[i-1][3];
                if (i == 1) {
                    d[i][1] = 1;
                }
            }
            if (i-2 >= 0) {
                d[i][2] = d[i-2][1] + d[i-2][3];
                if (i == 2) {
                    d[i][2] = 1;
                }
            }
            if (i-3 >= 0) {
                d[i][3] = d[i-3][1] + d[i-3][2];
                if (i == 3) {
                    d[i][3] = 1;
                }
            }
            d[i][1] %= mod;
            d[i][2] %= mod;
            d[i][3] %= mod;
        }
        int t = sc.nextInt();
        while (t-- > 0) {
            int n = sc.nextInt();
            System.out.println((d[n][1] + d[n][2] + d[n][3])%mod);
        }
    }
}


느낀점

동적계획법 을 이용한 문제다.

끝내 풀지 못하고 다른사람의 풀이를 참조해서 공부했다.

2차원 배열을 활용하는법 터득

  • D[i][j] = i를 1, 2, 3의 합으로 나타내는 방법의 수, 마지막에 사용한 수는 j
  • D[i][1] = D[i-1][2] + D[i-1][3] D[i][2] = D[i-2][1] + d[i-2][3] D[i][3] = D[i-3][2] + D[i-3][3]
  • 1, 2, 3 더하기에서 한 것 처럼 D[0] = 1로 초기화하면 중복이 발생한다. D[1][1] = D[0][2] + D[0][3] = 2 (중복이 발생하게 된다)
  • 따라서, 이 문제는 예외 처리를 해야 한다. D[i][1] • D[i-1][2] + D[i-1][3] (i > 1) • 1 (i == 1) • 0 (i < 1)

Leave a comment