Problem_Solving

백준(BOJ) 2579 : 계단 오르기 (실버3) / 자바(Java) 풀이

CONCAT 2024. 5. 6. 15:48
728x90

문제

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

3줄 요약

  • 계단 오르기 게임에서 얻을 수 있는 총 점수의 최댓값을 구하기 위해 다음과 같은 점화식을 세웁니다.
    • memo[i] = max(memo[i-3] + stairs[i-1], memo[i-2]) + stairs[i]
    • 현재 계단을 밟을 때, 이전에 밟은 계단이 i-3번째 계단인 경우와 i-2번째 계단인 경우 중 더 큰 점수를 선택하여 현재 계단의 점수를 더합니다.
  • 메모이제이션 기법을 사용하여 이전에 계산된 값을 저장하고 재사용함으로써 중복 계산을 피하고 효율성을 높입니다.
    • memo 배열을 사용하여 각 계단까지의 최대 점수를 저장합니다.
    • 점화식을 이용하여 계산할 때, 이미 계산된 값은 memo 배열에서 가져와 사용합니다.
  • 최종적으로 memo[n]에 저장된 값이 n개의 계단을 올랐을 때 얻을 수 있는 총 점수의 최댓값이 되며, 이를 출력합니다.

코드

// package boj2579;

import java.io.*;

public class Main {
    public static void main(String[] args) throws Exception {
        // 입력 파일에서 데이터 읽기 (테스트용)
        // System.setIn(new FileInputStream("src/input.txt"));
        
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        
        // 계단의 개수 n 입력받기
        int n = Integer.parseInt(br.readLine());
        
        // 계단의 점수를 저장할 배열 초기화
        int[] stairs = new int[n + 1];
        
        // 계단의 점수 입력받기
        for (int i = 1; i <= n; i++) {
            stairs[i] = Integer.parseInt(br.readLine());
        }
        
        br.close();
        
        // 메모이제이션을 위한 배열 초기화
        int[] memo = new int[n + 1];
        
        // 초기 값 설정
        memo[1] = stairs[1];
        if (n >= 2) {
            memo[2] = stairs[1] + stairs[2];
        }
        
        // 동적 계획법을 이용하여 최대 점수 계산
        for (int i = 3; i <= n; i++) {
            memo[i] = Math.max(memo[i - 3] + stairs[i - 1], memo[i - 2]) + stairs[i];
        }
        
        // 결과 출력
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        bw.write(Integer.toString(memo[n]));
        bw.flush();
        bw.close();
    }
}