[λ°±μ€€/python] 2579번 : 계단 였λ₯΄κΈ°

2021. 4. 13. 03:13

문제

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

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

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

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

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

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

 

μž…λ ₯

μž…λ ₯의 첫째 쀄에 κ³„λ‹¨μ˜ κ°œμˆ˜κ°€ 주어진닀.

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

 

좜λ ₯

첫째 쀄에 계단 였λ₯΄κΈ° κ²Œμž„μ—μ„œ 얻을 수 μžˆλŠ” 총 점수의 μ΅œλŒ“κ°’μ„ 좜λ ₯ν•œλ‹€.

 

μ •λ‹΅

import sys
input = sys.stdin.readline

n = int(input())
score = []

for _ in range(n):
    score.append(int(input()))

if n <= 2:
    print(sum(score))
else:
    total_score = [[score[i], score[i]] for i in range(n)]
    # 0 -> 1 이동
    total_score[1][0] += score[0]

    for i in range(2, n):
        total_score[i][0] += total_score[i - 1][1]
        total_score[i][1] += max(total_score[i-2])

    print(max(total_score[n-1]))

nμ—λŠ” κ³„λ‹¨μ˜ 개수λ₯Ό, scoreμ—λŠ” 각 κ³„λ‹¨μ˜ 점수λ₯Ό μ €μž₯ν•œλ‹€.

 

if n <= 2:
    print(sum(score))

계단이 2개 μ΄ν•˜λΌλ©΄ λͺ¨λ“  계단을 밟고 μ˜€λŠ” 것이 κ°€λŠ₯ν•˜λ―€λ‘œ

score에 μ €μž₯ν–ˆλ˜ 각 계단 점수의 합이 μ΅œλŒ€κ°’μ΄ λœλ‹€.

 

else:
    total_score = [[score[i], score[i]] for i in range(n)]
    # 0 -> 1 이동
    total_score[1][0] += score[0]

    for i in range(2, n):
        total_score[i][0] += total_score[i - 1][1]
        total_score[i][1] += max(total_score[i-2])

    print(max(total_score[n-1]))

계단이 2κ°œλ³΄λ‹€ λ§Žλ‹€λ©΄ μœ„ μ½”λ“œλ₯Ό μ‹€ν–‰ν•œλ‹€.

2차원 λ°°μ—΄ total_scoreλ₯Ό λ§Œλ“€μ–΄ 각 κ³„λ‹¨μ˜ 점수λ₯Ό 2κ°œμ”© μ €μž₯ν•œλ‹€.

각 ν–‰μ˜ 첫번째 μΈλ±μŠ€λŠ” ν•œ μΉΈ μ „μ—μ„œ μ΄λ™ν–ˆμ„ λ•Œμ΄κ³  λ‘λ²ˆμ§Έ μΈλ±μŠ€λŠ” 두 μΉΈ μ „μ—μ„œ μ΄λ™ν–ˆμ„ λ•Œμ΄λ‹€.

λ‘λ²ˆμ§Έ 계단인 total_score[1]은 두 μΉΈ μ „μ˜ 계단이 μ—†μœΌλ―€λ‘œ λ”°λ‘œ 계산해쀀닀.

ν•œ μΉΈ μ „μ—μ„œ μ΄λ™ν–ˆμ„ λ•ŒλŠ” 0번 계단과 1번 κ³„λ‹¨μ˜ 합이고

두 μΉΈ μ „μ—μ„œ μ΄λ™ν–ˆμ„ λ•ŒλŠ” λ°”λ‹₯μ—μ„œ μ΄λ™ν–ˆμ„ λ•Œμ΄λ―€λ‘œ total_score[1]이기 λ•Œλ¬Έμ— λ”°λ‘œ κ³„μ‚°ν•˜μ§€ μ•Šμ•„λ„ λœλ‹€.

 

2번 계단뢀터 for문을 μ§„ν–‰ν•œλ‹€.

 

ν•œ μΉΈ μ „μ—μ„œ μ΄λ™ν•˜μ—¬ i번째 계단에 도착할 λ•ŒμΈ total_score[i][0]은

μ—°μ†λœ μ„Έ 계단을 밟으면 μ•ˆλ˜κΈ° λ•Œλ¬Έμ—

ν•œ μΉΈ μ „ 계단인 total_score[i-1]이 두 μΉΈ μ „μ—μ„œ μ΄λ™ν•œ κ°’ 즉, total_score[i-1][1]이어야 ν•œλ‹€.

 

두 μΉΈ μ „μ—μ„œ μ΄λ™ν•˜μ—¬ i번째 계단에 도착할 λ•ŒμΈ total_score[i][0]은 

μ „ 계단이 무엇을 κ±°μ³μ˜€λ“  상관없기 λ•Œλ¬Έμ— 

두 μΉΈ μ „ 계단인 total_score[i-2] 쀑 큰 값을 더해쀀닀.

 

이λ₯Ό 그림으둜 ν‘œν˜„ν•˜λ©΄ λ‹€μŒκ³Ό κ°™λ‹€.

 

λ§ˆμ§€λ§‰ 계단인 total_score[n-1] 쀑 큰 값을 좜λ ₯ν•œλ‹€.

 

728x90

BELATED ARTICLES

more