백준 2579 계단 오르기 - JAVA

2025. 2. 1. 15:09·알고리즘/백준

2579 문제 링크


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

 

문제 설명


 

 

입출력


 

코드


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
import java.io.*;
import java.util.*;
 
public class Main {
    static int[] arr;
    static Integer[] dp;
    
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        
        int n = Integer.parseInt(br.readLine());
        arr = new int[n + 1];
        dp = new Integer[n + 1];
        
        for (int i = 1; i <= n; i++) {
            arr[i] = Integer.parseInt(br.readLine());
        }
        dp[0] = arr[0];
        dp[1] = arr[1];
        if(n >= 2) {
            dp[2] = arr[1] + arr[2];    
        }
        bw.write(String.valueOf(findMax(n)));
        bw.flush();
    }
    
    private static int findMax(int n) {
        if(dp[n] == null) {
            dp[n] = Math.max(findMax(n-2), findMax(n-3) + arr[n-1]) + arr[n];
        }
        
        return dp[n];
    }
}
Colored by Color Scripter
cs

 

알고리즘 설명


해당 문제는 저도 오래 고민하다가, 초등부 올림피아드 출제 문제라는 것을 보고 바로, 연습장을 꺼내 경우의 수를 적기 시작했습니다.
어떤걸 기준으로 경우의 수를 적을까 하다가, 마지막 계단을 밟아야 한다는 문제의 말을 보고, dp배열을 생성해 1부터 N까지 dp[N]에 올 수 있는 경우를 적었습니다. 예를 들어 N = 5의 경우, 최댓값을 가지기 위해 밟을 수 있는 계단은 3번째 계단과 4번째 계단뿐입니다. 그렇다면 dp[5] 즉, 5번째 계단까지의 최댓값은 dp[3]까지의 값과 dp[2] + arr[4] 중에서 더 큰 값을 고르면 되는 간단한 문제였습니다. dp[4]가 아니고 dp[2] + arr[4]인 이유는 간단합니다. 연속으로 3개의 계단을 밟을 수 없기때문에, 4를 통해 5번째 계단으로 가는 방법은 2 → 4 → 5 밖에 없기 때문에, dp[3]의 값이 들어가버리는 경우 3개의 계단을 연속으로 밟아버리는 경우의 수를 포함하기 때문에, dp[2]까지의 값과 3을 건너뛴 arr[4]의 값을 더하는 것입니다. top-down방식과 bottom-up방식 모두 가능하지만, 코드의 큰 차이는 없기 때문에 top-down방식으로 진행했습니다.

 

코드 해석


배열 원소를 지칭하는 번호와 계단의 번호를 맞추기 위해 1-base-position으로 arr 배열과 누적값을 넣을 dp 배열 을 생성합니다. arr 배열에 n번째 계단까지의 값을 넣어주고, dp[0] = 0 (자료형이 Integer이므로 기본값은 null), dp[1] = arr[1], dp[2] = arr[2]를 설정해주고, findMax함수를 생성해, n이 3이상인 경우, 알고리즘 설명의 점화식을 대입해서 dp[n]의 값을 구합니다.

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

백준 2667 단지번호붙이기 - JAVA  (1) 2025.02.03
백준 10844 쉬운 계단 수 - JAVA  (0) 2025.02.02
백준 1932 정수 삼각형 - JAVA  (0) 2025.01.31
백준 24479 알고리즘 수업 - 깊이 우선 탐색 1 - JAVA  (1) 2025.01.30
백준 11399 ATM - JAVA  (0) 2025.01.29
'알고리즘/백준' 카테고리의 다른 글
  • 백준 2667 단지번호붙이기 - JAVA
  • 백준 10844 쉬운 계단 수 - JAVA
  • 백준 1932 정수 삼각형 - JAVA
  • 백준 24479 알고리즘 수업 - 깊이 우선 탐색 1 - JAVA
BIS's tech Blog
BIS's tech Blog
Welcome to Kanghyun's tech blog :)
  • BIS's tech Blog
    벼익숙의 기술 블로그
    BIS's tech Blog
  • 전체
    오늘
    어제
    • 분류 전체보기 (67)
      • 알고리즘 (53)
        • 백준 (44)
        • 프로그래머스 (9)
      • CS 스터디 (14)
        • CS - JAVA (11)
        • CS - DB (3)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

    • GitHub
  • 공지사항

  • 인기 글

  • 태그

    재귀
    브루트포스
    Baekjoon
    동적 계획
    백준
    너비 우선 탐색
    DFS
    알고리즘 고득점 kit
    java
    자료구조
    Top-Down
    프로그래머스
    dp
    깊이 우선 탐색
    bottom-up
    완전탐색
    기술질문
    Lv2
    BFS
    CS
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
BIS's tech Blog
백준 2579 계단 오르기 - JAVA
상단으로

티스토리툴바