Algorithm/baekjoon

1,2,3 더하기 5

마닐라 2022. 2. 9. 20:21

📍 문제 설명

💡 접근

N의 범위가 커서 브루트포스로는 시간초과 나는 문제

n이라는 숫자가 m으로 끝나는 방법의 수를 담을 2차원 배열을 사용해야한다.

 

dp[1][1] = 1 (1)

dp[2][2] = 1 (2)

dp[3][1] = 1 (2+1)

dp[3][2] = 1 (1+2)

dp[3][3] = 1 (3)

 

dp[4][1] = 2 (3+1, 1+2+1)

dp[4][3] = 1 (1+3)

 

dp[n][1]의 일 때

dp[n-1][1]은 연속된 숫자가 되므로 제외하고 dp[n-1][2],dp[n-1][3] 에서 구한 방법의 수를 더해준다.

dp[n][2]의 일 때

dp[n-2][2]은 연속된 숫자가 되므로 제외하고 dp[n-2][1],dp[n-2][3] 에서 구한 방법의 수를 더해준다.

dp[n][3]의 일 때

dp[n-3][3]은 연속된 숫자가 되므로 제외하고 dp[n-3][1],dp[n-3][2] 에서 구한 방법의 수를 더해준다.

 

dp[4][1] = dp[3][2](2+1+2) + dp[3][3](1+3) = 2

dp[4][2] = dp[2][1] + dp[2][3] = 0

dp[4][3] = dp[1][1](1+3) + dp[1][2] = 1 이 되는것이다.

👩‍💻 코드

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

public class Main {
    static int n, m, answer;
    static int[][] board;
    static long[][] arr, dp = new long[100001][4];
    static boolean[][] visited;
    static int[] dx = {-1,1,0,0};
    static int[] dy = {0,0,-1,1};
    static ArrayList<String> list = new ArrayList<>();
    static StringBuilder sb = new StringBuilder();
    public static void main(String[] args) throws IOException {
        Scanner kb = new Scanner(System.in);
        Main T = new Main();
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        //int t = kb.nextInt();
        int t = Integer.parseInt(br.readLine());
        T.solution();
        for(int i = 0; i < t; i++) {
            //n = kb.nextInt();
            n = Integer.parseInt(br.readLine());
            //dp[n][m]은 n이라는 숫자가 m으로 끝나는 방법의 수
            long cnt = (dp[n][1]+ dp[n][2] + dp[n][3]) % 1000000009;
            sb.append(cnt).append("\n");
        }
        System.out.println(sb);
    }

    private void solution() {
        dp[1][1] = 1;
        dp[2][2] = 1;
        dp[3][1] = 1;
        dp[3][2] = 1;
        dp[3][3] = 1;
        for(int i = 4; i <= 100000; i++) {
            dp[i][1] = (dp[i - 1][2] + dp[i - 1][3]) % 1000000009;
            dp[i][2] = (dp[i - 2][1] + dp[i - 2][3]) % 1000000009;
            dp[i][3] = (dp[i - 3][1] + dp[i - 3][2]) % 1000000009;
        }
    }

}

'Algorithm > baekjoon' 카테고리의 다른 글

쉬운 계단 수  (0) 2022.02.09
카드 구매하기  (0) 2022.02.09
2×n 타일링  (0) 2022.02.08
종이 조각  (0) 2022.02.08
부분수열의 합  (0) 2022.02.08