λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
CS/μ•Œκ³ λ¦¬μ¦˜

λ°±μ€€ 2579 파이썬 - 계단 였λ₯΄κΈ° - 동적 κ³„νšλ²•

by πŸŒ»β™š 2021. 10. 10.

λ°±μ€€ 2579 파이썬

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

 

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

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

www.acmicpc.net

이번 λ¬Έμ œλŠ” 쑰건에 λ§žμΆ°μ„œ 계단을 였λ₯΄λ©΄μ„œ μ΅œλŒ€κ°’μ„ κ΅¬ν•˜λŠ” λ¬Έμ œμž…λ‹ˆλ‹€.

  • 계단은 ν•œλ²ˆμ— 1~2 계단씩 였λ₯Ό 수 μžˆλ‹€.
  • μ‹œμž‘μ μ€ ν¬ν•¨ν•˜μ§€ μ•Šκ³ ... μ—°μ†λœ 3개의 계단은 λ°Ÿμ„ 수 μ—†λ‹€. 즉, μ΅œλŒ€ 2개 κ³„λ‹¨κΉŒμ§€ μ—°μ†μœΌλ‘œ λ°Ÿμ„ 수 μžˆλ‹€.
  • λ§ˆμ§€λ§‰ κ³„λ‹¨μ—λŠ” λ°˜λ“―μ΄ λ„μ°©ν•΄μ•Όν•œλ‹€.

동적 κ³„νšλ²•μ„ μ‚¬μš©ν•˜λ©΄ ν˜„μž¬ μœ„μΉ˜μ˜ μ΅œλŒ€κ°’μ„ μ €μž₯ν•˜λ©΄μ„œ κ°€κΈ° λ•Œλ¬Έμ—... 3번 μ§Έ 쑰건은 크게 κ±±μ •ν•  것 μ—†κ³ ... λ¬Έμ œλŠ” 3개의 μ—°μ†λœ 계단을 λ°Ÿμ„ 수 μ—†λ‹€λŠ” 쑰건을 κ΅¬λΆ„ν•˜κΈ° μœ„ν•œ λ°©λ²•μž…λ‹ˆλ‹€.

 

3번 연속 밟으면 μ•ˆλ˜κΈ° λ•Œλ¬Έμ— 2번 μ—°μ†κΉŒμ§€λŠ” λ°Ÿμ„ 수 μžˆλ‹€. 그러면... ν˜„μž¬ μœ„μΉ˜μ— μžˆλŠ” 계단은 2가지 쑰건이 생긴닀.

  • 이전에 2계단 μ—°μ†μœΌλ‘œ 였λ₯΄κ³  ν˜„μž¬ 계단이 2계단을 였λ₯Έ κ³³
  • 3계단 μ΄μ „μ—μ„œ 2계단을 였λ₯΄κ³  λ°”λ‘œ 이전 κ³„λ‹¨μ—μ„œ λΆ€ν„° ν˜„μž¬ κ³„λ‹¨κΉŒμ§€ μ—°μ†μœΌλ‘œ 였λ₯Έλ‹€.

2가지 쑰건 쀑 μ΅œλŒ€κ°’μ΄ ν•΄λ‹Ή μœ„μΉ˜μ˜ μ΅œλŒ€κ°’μ΄λ‹€.

 

 

Python 풀이

import sys
read = sys.stdin.readline

n = int(read())
stairs = [0] + [int(read()) for _ in range(n)] + [0]
cache = [0] * (n+2)
cache[1] = stairs[1]
cache[2] = cache[1] + stairs[2]

for i in range(3, n+1):
    cache[i] = max(cache[i-2], cache[i-3] + stairs[i-1]) + stairs[i]
print(cache[n])
  • 각 계단 별 μˆ˜μΉ˜μ™€ λˆ„μ λœ ν˜„μž¬ μœ„μΉ˜μ˜ μ΅œλŒ€κ°’ λͺ¨λ‘ 리슀트둜 μ‚¬μš©λœλ‹€.

λˆ„μ λ˜λŠ” λ©”λͺ¨μ΄μ œμ΄μ…˜ μΊμ‹œκ°’ 기쀀을 λ°”λ‘œ 이전 μœ„μΉ˜λ‘œ μƒκ°ν•˜λ©΄ 많이 ν—·κ°ˆλ¦΄ 수 μžˆλ‹€. 이번 λ¬Έμ œλŠ” 2,3 계단 전이 κΈ°μ€€μ΄λœλ‹€.

λŒ“κΈ€