알고리즘

[백준] 9461번 파도반 수열 _ JAVA ( 주석 설명 ) 본문

백준 - JAVA/동적 계획법 1

[백준] 9461번 파도반 수열 _ JAVA ( 주석 설명 )

wch_s 2023. 2. 17. 22:47

1번

→ 노트에 적으며 규칙을 찾아보면 다음과 같은 점화식을 얻을 수 있다.

f(n) = f(n-5) + f(n-1)

→ Top-down 방식

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

public class Main {
    //출력값 범위가 int max 값을 넘어가므로 long 배열로 만든다.
    static long[] dp = new long[101]; //중복 계산을 막기 위해 중간 결과값들을 저장하기 위한 배열이다.

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        //규칙 정립을 위한 초기값 저장
        dp[1] = 1;
        dp[2] = 1;
        dp[3] = 1;
        dp[4] = 2;
        dp[5] = 2;


        int T = Integer.parseInt(br.readLine());

        StringBuilder sb = new StringBuilder();
        for(int i=0;i<T;++i){ //테스트케이스 숫자만큼 입력을 받는다.
            int N = Integer.parseInt(br.readLine());

            sb.append(solve(N)).append('\n');
        }

        System.out.println(sb); //입력받은 N번 정삼각형의 한 변의 길이를 출력한다.
    }

    //Top-down 방식
    private static long solve(int N){
        if(dp[N]>=1) //배열 안에 값이 들어가 있으면 그 값을 바로 return 한다.
            return dp[N];

        dp[N] = solve(N-5) + solve(N-1); //점화식을 찾고, 재귀로 N번째 정삼각형의 한 변의 길이를 구한다.

        return dp[N];
    }
}

 


 

2번

→ Bottom-up 방식

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

public class Main {
    //출력값 범위가 int max 값을 넘어가므로 long 배열로 만든다.
    static long[] dp = new long[101]; //중복 계산을 막기 위해 중간 결과값들을 저장하기 위한 배열이다.

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        //규칙 정립을 위한 초기값 저장
        dp[1] = 1;
        dp[2] = 1;
        dp[3] = 1;
        dp[4] = 2;
        dp[5] = 2;


        int T = Integer.parseInt(br.readLine());

        StringBuilder sb = new StringBuilder();
        for(int i=0;i<T;++i){ //테스트케이스 숫자만큼 입력을 받는다.
            int N = Integer.parseInt(br.readLine());

            sb.append(solve2(N)).append('\n');
        }

        System.out.println(sb); //입력받은 N번 정삼각형의 한 변의 길이를 출력한다.
    }

    //Bottom-up 방식
    private static long solve2(int N) {
        if(dp[N]>=1) //배열 안에 값이 들어가 있으면 그 값을 바로 return 한다.
            return dp[N];

        for(int i=6;i<=100;++i){ //6~100까지의 모든 값을 구한다.
            dp[i] = dp[i-5] + dp[i-1];
        }

        return dp[N];
    }
}