Lewis's Tech Keep

[백준] 계단 오르기 본문

Java/알고리즘

[백준] 계단 오르기

Lewis Seo 2021. 3. 5. 22:23

참고 : www.acmicpc.net/problem/2579

 

2579번: 계단 오르기

계단 오르기 게임은 계단 아래 시작점부터 계단 꼭대기에 위치한 도착점까지 가는 게임이다. <그림 1>과 같이 각각의 계단에는 일정한 점수가 쓰여 있는데 계단을 밟으면 그 계단에 쓰여 있는 점

www.acmicpc.net

 

- dp 문제

- 테이블 정의를 어떻게 하느냐에 따라 다르게 풀이 될 수 있는 점이 흥미로웠다.

- dp[i] : i 번째 계단을 밟지 않는 경우의 수의 최소 값 (i-1은 반드시 선택, i-2 or i-3 번째 중에 값을 선택하는 것)

 

더보기
import java.util.Scanner;

public class Solution {
	// 밟지 않는 경우의 수 체크
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int sum = 0;
        int n = sc.nextInt();
        int[] s = new int[305];
        for(int i = 1; i<=n; i++) {
            s[i] = sc.nextInt();
            sum += s[i];
        }
        if(n <= 2) {
            System.out.println(sum);
            return;
        }
        int[] dp = new int[305];
        dp[1] = s[1];
        dp[2] = s[2];
        dp[3] = s[3];
        for(int i=4; i<=n-1; i++) {
            dp[i] = Math.min(dp[i-2], dp[i-3]) + s[i];
        }
        System.out.println(sum - Math.min(dp[n-1], dp[n-2]));
    }
    // 밟는 경우의 수를 체크
//    public static void main(String[] args) {
//        Scanner sc = new Scanner(System.in);
//        int n = sc.nextInt();
//        int[] s = new int[n+5];
//        for(int i = 1; i<=n; i++) {
//            s[i] = sc.nextInt();
//        }
//        int[][] dp = new int[305][3];
//        dp[1][1] = s[1];
//        dp[1][2] = 0;
//        dp[2][1] = s[2];
//        dp[2][2] = s[1] + s[2];
//        for(int i=3; i<=n; i++) {
//            dp[i][1] = Math.max(dp[i-2][1], dp[i-2][2]) + s[i];
//            dp[i][2] = dp[i-1][1] + s[i];
//        }
//        System.out.println(Math.max(dp[n][1], dp[n][2]));
//    }
}

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

[백준] 구간 합 구하기 4  (0) 2021.03.06
[백준] RGB 거리  (0) 2021.03.06
[백준] 1, 2, 3 더하기  (0) 2021.03.05
[백준] 1로 만들기  (0) 2021.03.04
[프로그래머스] 정수 삼각형  (0) 2021.02.25
Comments