λΏŒμ•Ό._. 2021. 10. 20. 13:42

Silver III

문제(좜처: https://www.acmicpc.net/problem/11399)

<ATM>

문제 

 

μΈν•˜ μ€ν–‰μ—λŠ” ATM이 1λŒ€λ°–μ— μ—†λ‹€. μ§€κΈˆ 이 ATM μ•žμ— Nλͺ…μ˜ μ‚¬λžŒλ“€μ΄ 쀄을 μ„œμžˆλ‹€.
μ‚¬λžŒμ€ 1λ²ˆλΆ€ν„° Nλ²ˆκΉŒμ§€ λ²ˆν˜Έκ°€ 맀겨져 있으며, i번 μ‚¬λžŒμ΄ λˆμ„ μΈμΆœν•˜λŠ”λ° κ±Έλ¦¬λŠ” μ‹œκ°„μ€ Pi뢄이닀.
μ‚¬λžŒλ“€μ΄ 쀄을 μ„œλŠ” μˆœμ„œμ— λ”°λΌμ„œ, λˆμ„ μΈμΆœν•˜λŠ”λ° ν•„μš”ν•œ μ‹œκ°„μ˜ 합이 λ‹¬λΌμ§€κ²Œ λœλ‹€. 예λ₯Ό λ“€μ–΄, 총 5λͺ…이 있고, P1 = 3, P2 = 1, P3 = 4, P4 = 3, P5 = 2 인 경우λ₯Ό μƒκ°ν•΄λ³΄μž. [1, 2, 3, 4, 5] μˆœμ„œλ‘œ 쀄을 μ„ λ‹€λ©΄, 1번 μ‚¬λžŒμ€ 3λΆ„ λ§Œμ— λˆμ„ 뽑을 수 μžˆλ‹€. 2번 μ‚¬λžŒμ€ 1번 μ‚¬λžŒμ΄ λˆμ„ 뽑을 λ•ŒκΉŒμ§€ κΈ°λ‹€λ €μ•Ό ν•˜κΈ° λ•Œλ¬Έμ—, 3+1 = 4뢄이 걸리게 λœλ‹€. 3번 μ‚¬λžŒμ€ 1번, 2번 μ‚¬λžŒμ΄ λˆμ„ 뽑을 λ•ŒκΉŒμ§€ κΈ°λ‹€λ €μ•Ό ν•˜κΈ° λ•Œλ¬Έμ—, 총 3+1+4 = 8뢄이 ν•„μš”ν•˜κ²Œ λœλ‹€. 4번 μ‚¬λžŒμ€ 3+1+4+3 = 11λΆ„, 5번 μ‚¬λžŒμ€ 3+1+4+3+2 = 13뢄이 걸리게 λœλ‹€. 이 κ²½μš°μ— 각 μ‚¬λžŒμ΄ λˆμ„ μΈμΆœν•˜λŠ”λ° ν•„μš”ν•œ μ‹œκ°„μ˜ 합은 3+4+8+11+13 = 39뢄이 λœλ‹€.
쀄을 [2, 5, 1, 4, 3] μˆœμ„œλ‘œ 쀄을 μ„œλ©΄, 2번 μ‚¬λžŒμ€ 1λΆ„ λ§Œμ—, 5번 μ‚¬λžŒμ€ 1+2 = 3λΆ„, 1번 μ‚¬λžŒμ€ 1+2+3 = 6λΆ„, 4번 μ‚¬λžŒμ€ 1+2+3+3 = 9λΆ„, 3번 μ‚¬λžŒμ€ 1+2+3+3+4 = 13뢄이 걸리게 λœλ‹€. 각 μ‚¬λžŒμ΄ λˆμ„ μΈμΆœν•˜λŠ”λ° ν•„μš”ν•œ μ‹œκ°„μ˜ 합은 1+3+6+9+13 = 32뢄이닀. 이 방법보닀 더 ν•„μš”ν•œ μ‹œκ°„μ˜ 합을 μ΅œμ†Œλ‘œ λ§Œλ“€ μˆ˜λŠ” μ—†λ‹€.
쀄을 μ„œ μžˆλŠ” μ‚¬λžŒμ˜ 수 Nκ³Ό 각 μ‚¬λžŒμ΄ λˆμ„ μΈμΆœν•˜λŠ”λ° κ±Έλ¦¬λŠ” μ‹œκ°„ Piκ°€ μ£Όμ–΄μ‘Œμ„ λ•Œ, 각 μ‚¬λžŒμ΄ λˆμ„ μΈμΆœν•˜λŠ”λ° ν•„μš”ν•œ μ‹œκ°„μ˜ ν•©μ˜ μ΅œμ†Ÿκ°’μ„ κ΅¬ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€.

 

μž…λ ₯

 

첫째 쀄에 μ‚¬λžŒμ˜ 수 N(1 ≤ N ≤ 1,000)이 μ£Όμ–΄μ§„λ‹€. λ‘˜μ§Έ μ€„μ—λŠ” 각 μ‚¬λžŒμ΄ λˆμ„ μΈμΆœν•˜λŠ”λ° κ±Έλ¦¬λŠ” μ‹œκ°„ Pi
κ°€ μ£Όμ–΄μ§„λ‹€. (1 ≤ Pi ≤ 1,000)

 

좜λ ₯ 

 

첫째 쀄에 κ° μ‚¬λžŒμ΄ λˆμ„ μΈμΆœν•˜λŠ”λ° ν•„μš”ν•œ μ‹œκ°„μ˜ ν•©μ˜ μ΅œμ†Ÿκ°’μ„ 좜λ ₯ν•œλ‹€.

 

 

문제 풀이

   - my solution

import sys

if __name__=='__main__':
    N=int(input()) # μ‚¬λžŒμ˜ 수
    arr=list(map(int, sys.stdin.readline().split())) # μ‚¬λžŒμ΄ λˆμ„ μΈμΆœν•˜λŠ”λ° κ±Έλ¦¬λŠ” μ‹œκ°„

    arr.sort() # μ •λ ¬
    temp=[arr[0]]
    for i in range(1,len(arr)): # μ‹œκ°„μ˜ ν•©μ˜ μ΅œμ†Ÿκ°’ κ΅¬ν•˜κΈ°
        temp.append(temp[-1]+arr[i])

    print(sum(temp)) # 총 ν•©

 

  • λˆμ„ μΈμΆœν•˜λŠ”λ° ν•„μš”ν•œ μ‹œκ°„μ˜ 합을 μ΅œμ†Ÿκ°’μœΌλ‘œ λ§Œλ“€κΈ° μœ„ν•˜μ—¬ μ •λ ¬
  • μž‘μ€ κ°’λΆ€ν„° λ”ν•˜κΈ°
  • answer: list의 ν•© 

μƒκ°πŸ€”

 

이 문제λ₯Ό ν’€κΈ° μœ„ν•΄ μ‚¬μš©ν•΄μ•Ό ν•˜λŠ” μ•Œκ³ λ¦¬μ¦˜μ€ μ •λ ¬κ³Ό 그리디 μ•Œκ³ λ¦¬μ¦˜μ΄λΌκ³  ν•œλ‹€.

그리디 μ•Œκ³ λ¦¬μ¦˜μ΄λž€?

문제λ₯Ό ν•΄κ²°ν•˜λŠ” κ³Όμ •μ—μ„œ κ·Έ μˆœκ°„μˆœκ°„λ§ˆλ‹€ 졜적이라고 μƒκ°λ˜λŠ” 결정을 ν•˜λŠ” λ°©μ‹μœΌλ‘œ
μ§„ν–‰ν•˜μ—¬ μ΅œμ’… 해닡에 λ„λ‹¬ν•˜λŠ” 문제 ν•΄κ²° 방식이닀.

 

정렬을 ν•΄μ•Ό ν•˜λŠ” 것은 μƒκ°ν•΄λƒˆμ§€λ§Œ 그리디 μ•Œκ³ λ¦¬μ¦˜μ€ μƒκ°ν•˜μ§€ λͺ»ν–ˆλ‹€.

μ΅œμ†Ÿκ°’μœΌλ‘œ λ§Œλ“€κΈ° μœ„ν•΄ μ •λ ¬ν•΄μ•Ό ν•˜λ©°, λˆμ„ λ½‘λŠ” μ‹œκ°„μ„ κ΅¬ν•˜κΈ° μœ„ν•΄μ„œλŠ” μ•žμ—μ„œλΆ€ν„°

ν•˜λ‚˜μ”© λ”ν•˜λ©΄ λœλ‹€λŠ” 생각에 μ½”λ“œλ₯Ό μœ„μ™€ 같이 κ΅¬ν˜„ν•˜μ˜€λ‹€.

 

μ–΄λ–€ μ•Œκ³ λ¦¬μ¦˜μ„ μ‚¬μš©ν•΄μ•Ό ν•˜λŠ”μ§€λΆ€ν„° νŒŒμ•…ν•˜κΈ°κ°€ νž˜λ“  것 κ°™λ‹€. πŸ˜₯