파이썬 μ•Œκ³ λ¦¬μ¦˜

[μ΄μ½”ν…Œ Ch11-4] λ§Œλ“€ 수 μ—†λŠ” κΈˆμ•‘ (그리디)

은진 2022. 3. 8. 23:18

πŸ‘©πŸ»β€πŸ’»λ¬Έμ œμ„€λͺ…

[μ΄μ½”ν…Œ Ch11-4] λ§Œλ“€ 수 μ—†λŠ” κΈˆμ•‘ (그리디)
μ΄μ½”ν…Œ

동넀 편의점의 주인인 λ™λΉˆμ΄λŠ” N개의 동전을 κ°–κ³  μžˆλ‹€. 이 λ•Œ N개의 동전을 μ΄μš©ν•΄ λ§Œλ“€ 수 μ—†λŠ” μ–‘μ˜ μ •μˆ˜ κΈˆμ•‘ 쀑 μ΅œμ†Ÿκ°’μ„ κ΅¬ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•΄λΌ.


예λ₯Ό λ“€λ©΄,
N = 5이고, 각 동전이 각각 3원, 2원, 1원, 1원, 9μ›μ§œλ¦¬ 동전이라고 κ°€μ •ν•˜μž. μ΄λ•Œ λ™λΉˆμ΄κ°€ λ§Œλ“€ 수 μ—†λŠ” μ–‘μ˜ μ •μˆ˜ κΈˆμ•‘ 쀑 μ΅œμ†Ÿκ°’μ€ 8원이닀.

또 λ‹€λ₯Έ μ˜ˆμ‹œλ‘œ,
N = 3이고 각 동전이 각각 3원, 5원, 7원이면, λ§Œλ“€ 수 μ—†λŠ” μ–‘μ˜ μ •μˆ˜ κΈˆμ•‘ 쀑 μ΅œμ†Ÿκ°’μ€ 1원이닀.


μž…λ ₯쑰건

  • 첫째 μ€„μ—λŠ” λ™μ „μ˜ 개수λ₯Ό λ‚˜νƒ€λ‚΄λŠ” μ–‘μ˜ μ •μˆ˜ N이 주어진닀. (1 <= N <= 1,000)
  • λ‘˜μ§Έ μ€„μ—λŠ” 각 λ™μ „μ˜ 화폐 λ‹¨μœ„λ₯Ό λ‚˜νƒ€λ‚΄λŠ” N개의 μžμ—°μˆ˜κ°€ 주어지며, 각 μžμ—°μˆ˜λŠ” 곡백으둜 κ΅¬λΆ„ν•œλ‹€. 이 λ•Œ, 각 화폐 λ‹¨μœ„λŠ” 1,000,000(백만) μ΄ν•˜μ˜ μžμ—°μˆ˜λ‹€.

좜λ ₯쑰건

  • 첫째 쀄에 주어진 λ™μ „λ“€λ‘œ λ§Œλ“€ 수 μ—†λŠ” μ–‘μ˜ μ •μˆ˜ κΈˆμ•‘ 쀑 μ΅œμ†Ÿκ°’μ„ 좜λ ₯ν•œλ‹€.


μž…λ ₯μ˜ˆμ‹œ
5
3 2 1 1 9

좜λ ₯μ˜ˆμ‹œ
8


✍️Idea Sketch

문제 μš”μ•½

N개의 동전
1원뢀터 μ–‘μ˜ μ •μˆ˜ κΈˆμ•‘μ„ λ§Œλ“€ 수 μžˆλŠ”μ§€ 확인
λ§Œλ“€ 수 μ—†λŠ” μ–‘μ˜ μ •μˆ˜ κΈˆμ•‘ 쀑 μ΅œμ†Ÿκ°’μ€?


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

화폐 λ‹¨μœ„λŠ” 1,000,000 μ΄ν•˜μ˜ μžμ—°μˆ˜ --> O(n)인 μ•Œκ³ λ¦¬μ¦˜μœΌλ‘œ κ΅¬ν˜„ν•΄μ•Ό 함

1원, 2원, 3원, … κ°€μž₯ 큰 λ™μ „κΉŒμ§€ μ–‘μ˜ μ •μˆ˜ κΈˆμ•‘μ„ λ§Œλ“€ 수 μžˆλŠ”μ§€ νƒμƒ‰ν•œλ‹€. μž…λ ₯ μ‘°κ±΄μ—μ„œ 화폐 λ‹¨μœ„λŠ” μ΅œλŒ€ 1,000,000μ΄λ―€λ‘œ O(n^2)으둜 κ΅¬ν˜„ν•˜λ©΄ 1얡을 ν•œμ°Έ λ„˜μ–΄ μ‹œκ°„μ΄ˆκ³Όκ°€ μ˜ˆμƒλœλ‹€. λ”°λΌμ„œ O(n)의 κ·Έλ¦¬λ””ν•œ μ•Œκ³ λ¦¬μ¦˜μœΌλ‘œ κ΅¬ν˜„ν•΄μ•Όν•¨μ„ 눈치챌 수 μžˆλ‹€.


μ•Œκ³ λ¦¬μ¦˜ : 그리디

μœ„μ—μ„œ μ–ΈκΈ‰ν•œ λŒ€λ‘œ O(n)의 κ·Έλ¦¬λ””ν•œ μ•Œκ³ λ¦¬μ¦˜μœΌλ‘œ κ΅¬ν˜„ν•΄μ•Ό ν•œλ‹€. 창의λ ₯, 즉 문제λ₯Ό ν’€κΈ° μœ„ν•œ 아이디어λ₯Ό λ– μ˜¬λ¦¬λŠ” λŠ₯λ ₯이 μš”κ΅¬λœλ‹€. 아이디어λ₯Ό λ– μ˜¬λ¦¬λŠ” 것은 맀우 μ–΄λ ΅μ§€λ§Œ, 막상 λ– μ˜¬λ¦¬κ³  λ‚˜λ©΄ κ΅¬ν˜„μ€ μ‰¬μš΄ λ¬Έμ œμ΄λ‹€.


βœοΈλ‚΄ μ†ŒμŠ€μ½”λ“œ

λ§Œλ“€μˆ˜μ—†λŠ”κΈˆμ•‘

  import sys
  si = sys.stdin.readline

  n = int(si())
  coins = sorted(map(int, si().split()))
  cost = 0

  for coin in coins:
    if cost + 1 < coin:
      break
    else:
      cost += coin

  print(cost + 1)