알고리즘||코딩테스트/백준

[백준 2579번] 계단 오르기 - JAVA

째로스 2023. 7. 29. 16:56

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

 

2579번: 계단 오르기

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

www.acmicpc.net

풀이

사용한 알고리즘: 다이나믹 프로그래밍

 

풀이전략

마지막 계단을 반드시 밟아야하므로 방법은 2가지로 나뉜다.

1. 마지막에서 2번째 전 계단을 밟고 마지막 계단을 밟는 경우

2. 마지막에서 바로 전 계단을 밟고 마지막 계단을 밟는 경우

 

하지만 2번의 경우에는 전전 계단을 밟았을 가능성이 있다.

이를 피하기 위해 수정을 하면

(수정후) 2. 마지막에서 3번째 전 계단을 밟고, 마지막 직전 계단과 마지막 계단을 밟는 경우

로 수정할 수 있다.

 

따라서 d[i]에 i 번째 계단을 마지막일 때 가장 최대의 점수를 저장하고

graph[i]를 i 번째 계단의 점수를 뜻할 때, 식은

d[i]=Math.max(d[i-3]+stairs[i-1]+stairs[i],d[i-2]+stairs[i]) 가 된다.

 

제출코드

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

public class Main {
    public static void main(String args[]) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int N = Integer.parseInt(br.readLine());
        int stairs[] = new int[N+1];

        for(int i=1;i<N+1;++i){
            stairs[i]=Integer.parseInt(br.readLine());
        }

        int d[]= new int[301];
        if(N>=1) d[1]=stairs[1];
        if(N>=2) d[2]=stairs[1]+stairs[2];
        for(int i=3;i<N+1;++i){
            d[i]=Math.max(d[i-3]+stairs[i-1]+stairs[i],d[i-2]+stairs[i]);
        }
        System.out.println(d[N]);
    }
}