Problem Solving/BOJ & Programmers

[BOJ] 2579번: 계단 였λ₯΄κΈ°

geum 2024. 10. 21. 18:03

✏️ 문제

계단 였λ₯΄κΈ° κ²Œμž„μ€ 계단 μ•„λž˜ μ‹œμž‘μ λΆ€ν„° 계단 κΌ­λŒ€κΈ°μ— μœ„μΉ˜ν•œ λ„μ°©μ κΉŒμ§€ κ°€λŠ” κ²Œμž„μ΄λ‹€. <κ·Έλ¦Ό 1>κ³Ό 같이 각각의 κ³„λ‹¨μ—λŠ” μΌμ •ν•œ μ μˆ˜κ°€ μ“°μ—¬ μžˆλŠ”λ° 계단을 밟으면 κ·Έ 계단에 μ“°μ—¬ μžˆλŠ” 점수λ₯Ό μ–»κ²Œ λœλ‹€.

<κ·Έλ¦Ό 1>

 

예λ₯Ό λ“€μ–΄ <κ·Έλ¦Ό 2>와 같이 μ‹œμž‘μ μ—μ„œλΆ€ν„° 첫 번째, 두 번째, λ„€ 번째, μ—¬μ„― 번째 계단을 λ°Ÿμ•„ 도착점에 λ„λ‹¬ν•˜λ©΄ 총 μ μˆ˜λŠ” 10 + 20 + 25 + 20 = 75점이 λœλ‹€.

<κ·Έλ¦Ό 2>

 

계단 였λ₯΄λŠ” λ°λŠ” λ‹€μŒκ³Ό 같은 κ·œμΉ™μ΄ μžˆλ‹€.

 

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

 

λ”°λΌμ„œ 첫 번째 계단을 밟고 이어 두 번째 κ³„λ‹¨μ΄λ‚˜, μ„Έ 번째 κ³„λ‹¨μœΌλ‘œ 였λ₯Ό 수 μžˆλ‹€. ν•˜μ§€λ§Œ, 첫 번째 계단을 밟고 이어 λ„€ 번째 κ³„λ‹¨μœΌλ‘œ μ˜¬λΌκ°€κ±°λ‚˜, 첫 번째, 두 번째, μ„Έ 번째 계단을 μ—°μ†ν•΄μ„œ λͺ¨λ‘ λ°Ÿμ„ μˆ˜λŠ” μ—†λ‹€.

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

 

πŸ€– μž…μΆœλ ₯ μ˜ˆμ‹œ

 

πŸ’‘ 풀이

DP λŠλ‚Œμ΄ ν’€ν’€ λ‚˜λŠ” λ¬Έμ œλΌμ„œ 풀이 단계λ₯Ό μˆœμ„œλŒ€λ‘œ 적어보겠닀. 일단 이 λ¬Έμ œμ—μ„œ DP ν…Œμ΄λΈ”μ˜ 역할은 'i번째 κ³„λ‹¨κΉŒμ§€ λ„λ‹¬ν–ˆμ„ λ•Œ 얻을 수 μžˆλŠ” μ΅œλŒ€ 점수'이고 μ΅œμ’…μ μœΌλ‘œ DP ν…Œμ΄λΈ”μ˜ λ§ˆμ§€λ§‰ 값이 이 κ²Œμž„μ—μ„œ 얻을 수 μžˆλŠ” μ΅œλŒ“κ°’μ΄ λœλ‹€.

 

🌟 점화식 μ„Έμš°κΈ°

점화식을 μ„Έμš°κΈ° μ „ μ•„λž˜ 두 κ°€μ§€λŠ” 금방 νŒŒμ•…ν•  수 μžˆμ—ˆλ‹€. λ¬Όλ‘  λ‚˜λŠ” μ—¬κΈ°μ„œ ν•œ 단계 더 λ‚˜μ•„κ°€μ„œ 점화식을 λ°”λ‘œ μ„Έμš°μ§€λŠ” λͺ»ν–ˆμ§€λ§Œ..!

 

β‘  μ„Έ 개의 계단을 μ—°μ†μœΌλ‘œ λ°Ÿμ„ 수 μ—†κΈ° λ•Œλ¬Έμ— (i번째 계단 κΈ°μ€€) i-2번째 계단을 밟고 i번째 κ³„λ‹¨μœΌλ‘œ μ˜€κ±°λ‚˜ (i번째 계단 κΈ°μ€€) i-3번째 계단, i-1번째 계단을 밟고 i번째 κ³„λ‹¨μœΌλ‘œ μ˜€κ±°λ‚˜

β‘‘ μœ„μ˜ 두 가지 경우λ₯Ό λΉ„κ΅ν•΄μ„œ 값이 큰 걸둜 DP ν…Œμ΄λΈ”μ„ κ°±μ‹ 

 

β‘ μ—μ„œ 점화식을 λ§Œλ“€μ–΄λ³΄μžλ©΄ μ•„λž˜μ™€ κ°™λ‹€.

 

i-2번째 계단을 밟고 i번째 κ³„λ‹¨μœΌλ‘œ μ˜€λŠ” 경우: dp[i-2]+stairs[i]

i-3번째 계단, i-1번째 계단을 밟고 i번째 κ³„λ‹¨μœΌλ‘œ μ˜€λŠ” 경우: dp[i-3]+stairs[i-1]+stairs[i]

 

πŸ‘©‍πŸ’» μ½”λ“œ

import sys

input = sys.stdin.readline

N = int(input())

stairs = [0]
dp = [0]*(N+1)  # i번째 κ³„λ‹¨κΉŒμ§€ 왔을 λ•Œ 얻을 수 μžˆλŠ” μ΅œλŒ€ 점수

for _ in range(N):
    stairs.append(int(input()))

if N == 1:
    print(stairs[1])
else:
    dp[1] = stairs[1]
    dp[2] = stairs[1]+stairs[2]

    for i in range(3, N+1):
        dp[i] = max(dp[i-2]+stairs[i], dp[i-3]+stairs[i-1]+stairs[i])

    print(dp[N])

 

이 λ•Œ 계단이 ν•˜λ‚˜λ§Œ μžˆμ„ κ²½μš°μ—λŠ” dp[2]λ₯Ό μ±„μš°λŠ” λΆ€λΆ„μ—μ„œ 인덱슀 μ—λŸ¬κ°€ λ‚˜κΈ° λ•Œλ¬Έμ— 첫 번째 계단 값을 κ·ΈλŒ€λ‘œ 좜λ ₯ν•΄μ£Όλ©΄ λœλ‹€.

 

DP ν…Œμ΄λΈ”μ„ λ§Œλ“€κ³ , 적절히 μ΄μš©ν•˜λŠ” μ—°μŠ΅μ„ 계속 ν•΄μ•Όκ² λ‹€.