[BOJ/λ°±μ€€] 2597 계단 였λ₯΄κΈ°(JAVA)

2025. 2. 14. 15:15Β·πŸ’ͺ Algorithm
λ°˜μ‘ν˜•

링크

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

 

문제 μš”μ•½

각 계단에 μ“°μ—¬ μžˆλŠ” μ μˆ˜κ°€ μ£Όμ–΄μ§ˆ λ•Œ 이 κ²Œμž„μ—μ„œ 얻을 수 μžˆλŠ” 총점수의 μ΅œλŒ“κ°’ κ΅¬ν•˜κΈ°

  1. 계단은 ν•œ λ²ˆμ— ν•œ 계단씩 λ˜λŠ” 두 계단씩 였λ₯Ό 수 μžˆλ‹€.
  2. μ—°μ†λœ μ„Έ 개의 계단을 λͺ¨λ‘ λ°Ÿμ•„μ„œλŠ” μ•ˆ λœλ‹€. 단, μ‹œμž‘μ μ€ 계단에 ν¬ν•¨λ˜μ§€ μ•ŠλŠ”λ‹€.
  3. λ§ˆμ§€λ§‰ 도착 계단은 λ°˜λ“œμ‹œ λ°Ÿμ•„μ•Ό ν•œλ‹€.

 

μ œν•œ

  • 첫째 쀄에 κ³„λ‹¨μ˜ 개수 μ£Όμ–΄μ§„λ‹€.
    • 300 μ΄ν•˜μ˜ μžμ—°μˆ˜
  • λ‘˜μ§Έ 쀄뢀터 ν•œ 쀄에 ν•˜λ‚˜μ”© 제일 μ•„λž˜μ— 놓인 계단뢀터 μˆœμ„œλŒ€λ‘œ 각 계단에 μ“°μ—¬ μžˆλŠ” μ μˆ˜κ°€ μ£Όμ–΄μ§„λ‹€.
    • 계단에 μ“°μ—¬ μžˆλŠ” μ μˆ˜λŠ” 10,000 μ΄ν•˜μ˜ μžμ—°μˆ˜

풀이

μ£Όμ–΄μ§„ μ˜ˆμ œμ— λŒ€ν•΄ μ΅œλŒ€ 점수둜 각 계단에 λ„μ°©ν•˜λŠ” 방식은 μ•„λž˜μ™€ κ°™μŠ΅λ‹ˆλ‹€.

도착 계단 1번 2번 3번 4번 5번 6번
경둜 1 1-2 2-3 1-2-4 1-2-4-5 1-2-4-6
점수 10 10+20 20+15 10+20+25 10+20+25+10 10+20+25+20


처음 봀을 λ•Œ κ°€λŠ₯ν•œ 경둜λ₯Ό λ‹€μŒκ³Ό 같이 정리해 λ΄€μŠ΅λ‹ˆλ‹€.

  • 1번: 항상 1
  • 2번: 항상 1-2
  • 3번: 1-2-3(2번 점수>1번 점수일 λ•Œ) / 1-3(1번 점수>2번 점수일 λ•Œ)
    • ⇒ (1,2번 쀑 μ μˆ˜κ°€ 큰 μͺ½) + 3번 점수
  • 4번: 1-2-4(2번 점수>3번 점수일 λ•Œ) / 1-3-4(3번 점수>2번 점수일 λ•Œ)
    • ⇒ (2,3번 쀑 μ μˆ˜κ°€ 큰 루트) + 4번 점수
  • ...

 

1번과 2λ²ˆμ€ 항상 κ²½λ‘œκ°€ κ°™μœΌλ―€λ‘œ μ΄ˆκΈ°κ°’μ„ μ§€μ •ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

κ·Έ μ΄μ™Έμ˜ 숫자 NκΉŒμ§€μ˜ κ²½λ‘œλŠ” (N-1, N-2번 쀑 μ μˆ˜κ°€ 큰 μͺ½ 루트) + N번 점수라고 μ •λ¦¬ν–ˆμŠ΅λ‹ˆλ‹€.

 

ν•˜μ§€λ§Œ μ΄λŠ” 잘λͺ»λœ μ •λ¦¬μž…λ‹ˆλ‹€!!

 

3λ²ˆκΉŒμ§€μ˜ 루트λ₯Ό λ΄…μ‹œλ‹€.

1번과 2번 쀑 2번의 μ μˆ˜κ°€ 더 ν¬λ―€λ‘œ 2λ²ˆκΉŒμ§€μ˜ 루트 + 3λ²ˆμ„ μ„ νƒν•˜κ²Œ λ©λ‹ˆλ‹€.

근데, μ΄λ ‡κ²Œ 되면 λ£¨νŠΈκ°€ 1-2-3μ΄λ―€λ‘œ μ—°μ†λœ μ„Έ 개의 계단을 밟으면 μ•ˆ λœλ‹€λŠ” κ·œμΉ™μ„ μ–΄κΈ°κ²Œ λ©λ‹ˆλ‹€.

 

⇒ Nλ²ˆκΉŒμ§€μ˜ 루트λ₯Ό μ •ν•  λ•Œ N-1번 루트λ₯Ό κ°€μ Έλ‹€ μ“°λ©΄, μ—°μ†λœ μ„Έ 개의 계단을 λ°Ÿμ•˜λŠ”μ§€ κ³ λ €ν•  수 μ—†μŠ΅λ‹ˆλ‹€.

 

 

N번째 계단에 였기 직전을 생각해 λ΄…μ‹œλ‹€. 총 두 κ°€μ§€ κ²½μš°κ°€ λ°œμƒν•  수 μžˆμŠ΅λ‹ˆλ‹€.

  1. `N-2`번째 계단 λ„μ°©ν•˜κ³ , N번째 계단 밟기(두 계단 μ˜€λ¦„)
  2. N-3번째 계단 λ„μ°©ν•˜κ³ , N-1번째 계단을 밟고, N번째 계단 밟기(ν•œ 계단 μ˜€λ¦„)

 

2번째 κ²½μš°λŠ” 3 계단을 μ—°μ†μœΌλ‘œ λ°Ÿμ§€ μ•ŠκΈ° μœ„ν•΄ N-3λ²ˆμ§ΈκΉŒμ§€ κ³ λ €ν•΄μ•Ό ν•©λ‹ˆλ‹€.

결둠적으둜, μ € 두 경우 쀑 점수 합이 큰 루트λ₯Ό μ„ νƒν•˜λ©΄ λ©λ‹ˆλ‹€!

 

두 경우둜 λ‚˜λˆ  경둜λ₯Ό λ‹€μ‹œ μ •λ¦¬ν•˜λ©΄ λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

  • 1번: 항상 1
  • 2번: 항상 1-2
  • 3번: 2-3(1번 루트+3번) / 1-3(μ‹œμž‘μ +1번+3번)
  • 4번: 1-2-4(2번 루트+4번) / 1-3-4(1번 루트+3번+4번)
  • 5번: 1-2-4-5(4번 루트+5번) / (3번 루트+4번+5번)
  • ...

 

μ½”λ“œ

import java.util.*;
import java.io.*;

public class Main {

    static int N;
    static int[] dp;
    static int[] arr;

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

        N = Integer.parseInt(br.readLine());
        dp = new int[N + 1];
        arr = new int[N + 1];

        for (int i = 1; i <= N; i++) {
            arr[i] = Integer.parseInt(br.readLine());
        }
        dp[1] = arr[1];
        System.out.print(sol(N));
    }

    // N번 계단 도착 = ((N-2번 계단 밟기) or (N-3번과 N-1번 계단 밟기)) + N번 계단 밟기
    static int sol(int num) {
        if(dp[num] > 0){ // 이미 κ³„μ‚°λœ 경우
            return dp[num];
        }

        if(num <= 1){
            return dp[num];
        }

        if (num == 2) { // 2번 계단은 항상 1번 계단 + 2번 계단
            return dp[2] = arr[1] + arr[2];
        }

        return dp[num] = Math.max(sol(num - 2), sol(num - 3) + arr[num - 1]) + arr[num];
    }
}

🏷 μ‹œκ°„ λ³΅μž‘λ„

  • 각 N개의 계단에 λŒ€ν•΄ μ΅œλŒ€ 점수λ₯Ό ν•œ λ²ˆμ”©λ§Œ κ³„μ‚°ν•˜λ―€λ‘œ μ‹œκ°„ λ³΅μž‘λ„λŠ” O(N)

🏷 μ‹€ν–‰ 속도

Time: 100 ms, Memory: 14224 KB

λ°˜μ‘ν˜•

'πŸ’ͺ Algorithm' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

[BOJ/λ°±μ€€] 1010 닀리 놓기 (JAVA)  (1) 2025.02.13
[BOJ/λ°±μ€€] 13023 ABCDE(JAVA)  (1) 2025.02.12
[BOJ/λ°±μ€€] 2178 미둜 탐색(JAVA)  (1) 2025.02.11
[BOJ/λ°±μ€€] 1931 νšŒμ˜μ‹€ λ°°μ •(JAVA)  (1) 2025.02.10
'πŸ’ͺ Algorithm' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€
  • [BOJ/λ°±μ€€] 1010 닀리 놓기 (JAVA)
  • [BOJ/λ°±μ€€] 13023 ABCDE(JAVA)
  • [BOJ/λ°±μ€€] 2178 미둜 탐색(JAVA)
  • [BOJ/λ°±μ€€] 1931 νšŒμ˜μ‹€ λ°°μ •(JAVA)
dev-heyjin
dev-heyjin
  • dev-heyjin
    개발 기둝
    dev-heyjin
  • 전체
    였늘
    μ–΄μ œ
    • λΆ„λ₯˜ 전체보기 (56)
      • 🎯 Programming (8)
      • πŸ’ͺ Algorithm (16)
      • βš™οΈ CS (31)
        • λ„€νŠΈμ›Œν¬ (15)
        • 운영체제 (15)
        • λ°μ΄ν„°λ² μ΄μŠ€ (0)
  • λΈ”λ‘œκ·Έ 메뉴

    • ν™ˆ
    • νƒœκ·Έ
    • λ°©λͺ…둝
  • 링크

  • 곡지사항

  • 인기 κΈ€

  • νƒœκ·Έ

    DB
    λ°μ΄ν„°λ² μ΄μŠ€
    ν•΄ν‚Ή
    RDS
  • 졜근 λŒ“κΈ€

  • 졜근 κΈ€

  • hELLOΒ· Designed Byμ •μƒμš°.v4.10.3
dev-heyjin
[BOJ/λ°±μ€€] 2597 계단 였λ₯΄κΈ°(JAVA)
μƒλ‹¨μœΌλ‘œ

ν‹°μŠ€ν† λ¦¬νˆ΄λ°”