본문 바로가기
알고리즘/DynamicProgramming

1, 2, 3 더하기 백준 9095 ( dp )

by 꽃요미 2025. 2. 17.

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

 

dp를 활용한 문제.

처음에는 덧셈 결과를 가지고 점화식을 세우는줄 알았는데,
합이 1일때 경우의수

합이 2일때 경우의수

합이 3일때 경우의수 ,,,, 이렇게 해서 

dp[i] = dp[i-3]+dp[i-2]+dp[i-3] 점화식을 세워서

for 루프를 한번만 돌려서 O(N) 시간 복잡도가 걸린다.

 

악필이지만 이해바람

 

이렇게 규칙을 발견하면 i-1, i-2, i-3 더한 값이 i 에 할당되는 점화식을 세울 수 있다.

 

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

public class onetwothree {
    static StringBuilder sb;
    static int N;
    static int[] dp;
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        N = Integer.parseInt(br.readLine());
        sb = new StringBuilder();
        sum();
        while(N-- > 0) {
            int num = Integer.parseInt(br.readLine());
            sb.append(dp[num]).append("\n");
        }
        System.out.println(sb);
    }
    private static void sum() {
        dp = new int[11];
        dp[1] = 1;
        dp[2] = 2;
        dp[3] = 4;
        for(int i = 4; i < dp.length; i++) {
            dp[i] = dp[i-1] + dp[i-2] +dp[i-3];
        }
    }
}

 

그래서 코드에서도 보듯이 첫 값을

dp[1] : 합이 1일때 경우의 수

dp[2] : 합이 2일때 경우의 수

dp[3] : 합이 3일때 경우의 수

할당시켜놓고 4부터 for 반복문을 돌면서 dynamic programming을 해주면 답이 나온다.

끝.

'알고리즘 > DynamicProgramming' 카테고리의 다른 글

푼 dp 유형 정리  (0) 2025.02.27
최대 부분 수열  (0) 2025.02.27
LIS 가장 긴 증가하는 부분 수열 ( 백준 11053 )  (0) 2025.02.27
포도주 시식 ( 백준 2156 )  (0) 2025.02.26
1로 만들기 ( 백준 1463 )  (0) 2025.02.24