μ•Œκ³ λ¦¬μ¦˜/μ•Œκ³ λ¦¬μ¦˜ κ°œλ…

[μ•Œκ³ λ¦¬μ¦˜] 그리디(Greedy) μ•Œκ³ λ¦¬μ¦˜μ΄λž€

μΈν¬λ§ˆν‹± 2025. 5. 16. 15:30

1. 그리디 μ•Œκ³ λ¦¬μ¦˜(νƒμš•λ²•)μ΄λž€?

그리디 μ•Œκ³ λ¦¬μ¦˜(νƒμš•λ²•)은 ν˜„μž¬ μƒν™©μ—μ„œ μ§€κΈˆ λ‹Ήμž₯ 쒋은 κ²ƒλ§Œ κ³ λ₯΄λŠ” 방법을 μ˜λ―Έν•©λ‹ˆλ‹€.
μ‰½κ²Œ λ§ν•˜λ©΄ νƒμš•μŠ€λŸ½κ²Œ 졜고의 μ„ νƒλ§Œ μ·¨ν•˜λŠ” 것을 λ§ν•©λ‹ˆλ‹€.

  • 일반적인 그리디 μ•Œκ³ λ¦¬μ¦˜μ€ 문제λ₯Ό ν’€κΈ° μœ„ν•œ μ΅œμ†Œν•œμ˜ 아이디어λ₯Ό λ– μ˜¬λ¦΄ 수 μžˆλŠ” λŠ₯λ ₯을 μš”κ΅¬ν•©λ‹ˆλ‹€.
  • 그리디 해법은 κ·Έ μ •λ‹Ήμ„± 뢄석이 μ€‘μš”ν•©λ‹ˆλ‹€.
    λ‹¨μˆœνžˆ κ°€μž₯ μ’‹μ•„ λ³΄μ΄λŠ” 것을 반볡적으둜 선택해도 졜적의 ν•΄λ₯Ό ꡬ할 수 μžˆλŠ”μ§€ κ²€ν† ν•©λ‹ˆλ‹€.

βœ”οΈ 그리디 μ•Œκ³ λ¦¬μ¦˜μ€ 항상 졜적의 ν•΄λ₯Ό 보μž₯ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

  • 일반적인 μƒν™©μ—μ„œ 그리디 μ•Œκ³ λ¦¬μ¦˜μ€ 졜적의 ν•΄λ₯Ό 보μž₯ν•  수 없을 λ•Œκ°€ λ§ŽμŠ΅λ‹ˆλ‹€.
  • ν•˜μ§€λ§Œ μ½”λ”© ν…ŒμŠ€νŠΈμ—μ„œμ˜ λŒ€λΆ€λΆ„μ˜ 그리디 λ¬Έμ œλŠ” νƒμš•λ²•μœΌλ‘œ 얻은 ν•΄κ°€ 졜적의 ν•΄κ°€ λ˜λŠ” μƒν™©μ—μ„œ, 이λ₯Ό μΆ”λ‘ ν•  수 μžˆμ–΄μ•Ό 풀리도둝 μΆœμ œλ©λ‹ˆλ‹€.

 

νŠΈλ¦¬μ—μ„œ 경둜λ₯Ό μ΄λ™ν•˜λ©΄μ„œ 각 λ…Έλ“œμ˜ 합이 μ΅œλŒ€κ°€ λ˜λŠ” 경우λ₯Ό μƒκ°ν•΄λ΄…λ‹ˆλ‹€.

μ‹€μ œ 졜적의 ν•΄ / 그리디 μ•Œκ³ λ¦¬μ¦˜μ˜ ν•΄

μ‹€μ œ 각 λ…Έλ“œμ˜ 합이 μ΅œλŒ€κ°€ λ˜λŠ” κ²½μš°λŠ” μ™Όμͺ½κ³Ό κ°™μŠ΅λ‹ˆλ‹€. ν•˜μ§€λ§Œ, 그리디 μ•Œκ³ λ¦¬μ¦˜μ„ μ‚¬μš©ν•˜μ—¬ λ§€μˆœκ°„ 졜적의 값을 μ„ νƒν•˜κ²Œ λœλ‹€λ©΄ 였λ₯Έμͺ½κ³Ό 같은 κ²½λ‘œκ°€ μ„€μ •λ˜κ³  졜적의 ν•΄κ°€ μ•„λ‹™λ‹ˆλ‹€.

이처럼 그리디 μ•Œκ³ λ¦¬μ¦˜μ€ 항상 졜적의 ν•΄λ₯Ό 보μž₯ν•˜λŠ” 것은 μ•„λ‹ˆμ§€λ§Œ 속도가 ꡉμž₯히 λΉ λ₯΄κΈ° λ•Œλ¬Έμ— 자주 μ‚¬μš©λ©λ‹ˆλ‹€. κ·Έλ ‡κΈ° λ•Œλ¬Έμ— 항상 졜적의 ν•΄λ₯Ό 보μž₯ν•˜λ„λ‘ νŠΉμˆ˜ν•œ 쑰건을 λ§Œμ‘±μ‹œμΌœμ€˜μ•Ό ν•©λ‹ˆλ‹€.

 

 

2. <문제> κ±°μŠ€λ¦„λˆ

당신은 μŒμ‹μ μ˜ 계산을 λ„μ™€μ£ΌλŠ” μ μ›μž…λ‹ˆλ‹€. μΉ΄μš΄ν„°μ—λŠ” κ±°μŠ€λ¦„λˆμœΌλ‘œ μ‚¬μš©ν•  500원, 100원, 50원, 10μ›μ§œλ¦¬ 동전이 λ¬΄ν•œνžˆ μ‘΄μž¬ν•œλ‹€κ³  κ°€μ •ν•©λ‹ˆλ‹€. μ†λ‹˜μ—κ²Œ 거슬러 μ£Όμ–΄μ•Ό ν•  돈이 N원일 λ•Œ 거슬러 μ£Όμ–΄μ•Ό ν•  λ™μ „μ˜ μ΅œμ†Œ 개수λ₯Ό κ΅¬ν•˜μ„Έμš”. 단, 거슬러 μ€˜μ•Ό ν•  돈 N은 항상 10의 λ°°μˆ˜μž…λ‹ˆλ‹€.

졜적의 ν•΄λ₯Ό λΉ λ₯΄κ²Œ κ΅¬ν•˜κΈ° μœ„ν•΄μ„œλŠ” κ°€μž₯ 큰 화폐 λ‹¨μœ„λΆ€ν„° λˆμ„ 거슬러 μ£Όλ©΄ λ©λ‹ˆλ‹€.

  • N원을 거슬러 μ€˜μ•Ό ν•  λ•Œ, κ°€μž₯ λ¨Όμ € 500μ›μœΌλ‘œ 거슬러 쀄 수 μžˆμ„ 만큼 거슬러 μ€λ‹ˆλ‹€.
    이후에 100원, 500원, 10μ›μ§œλ¦¬ 동전을 μ°¨λ‘€λŒ€λ‘œ 거슬러 쀄 수 μžˆμ„ 만큼 거슬러 μ£Όλ©΄ λ©λ‹ˆλ‹€.
  • N = 1,260일 λ•Œμ˜ μ˜ˆμ‹œλ₯Ό 확인해 λ΄…μ‹œλ‹€.

STEP 0)

화폐 λ‹¨μœ„ 500 100 50 10
μ†λ‹˜μ΄ 받은 개수 0 0 0 0

STEP 1)

화폐 λ‹¨μœ„ 500 100 50 10
μ†λ‹˜μ΄ 받은 개수 2 0 0 0

STEP 2)

화폐 λ‹¨μœ„ 500 100 50 10
μ†λ‹˜μ΄ 받은 개수 2 2 0 0

STEP 3)

화폐 λ‹¨μœ„ 500 100 50 10
μ†λ‹˜μ΄ 받은 개수 2 2 1 0

STEP 4)

화폐 λ‹¨μœ„ 500 100 50 10
μ†λ‹˜μ΄ 받은 개수 2 2 1 1

 

결둠적으둜 μ†λ‹˜μ€ λ™μ „μ˜ μ΅œμ†Œ 개수λ₯Ό λ°›κ³  졜적의 ν•΄λ₯Ό λ„μΆœν•©λ‹ˆλ‹€.
κ°€μž₯ 큰 화폐 λ‹¨μœ„λΆ€ν„° λˆμ„ 거슬러 μ£ΌλŠ” 것이 졜적의 ν•΄λ₯Ό 보μž₯ν•˜λŠ” μ΄μœ κ°€ λ¬΄μ—‡μΌκΉŒ?

  • κ°€μ§€κ³  μžˆλŠ” 동전 μ€‘μ—μ„œ ν° λ‹¨μœ„κ°€ 항상 μž‘μ€ λ‹¨μœ„μ˜ λ°°μˆ˜μ΄λ―€λ‘œ μž‘μ€ λ‹¨μœ„μ˜ 동전듀을 μ’…ν•©ν•΄ λ‹€λ₯Έ ν•΄κ°€ λ‚˜μ˜¬ 수 μ—†κΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€.  λ§Œμ•½μ— 800원을 거슬러 μ£Όμ–΄μ•Ό ν•˜λŠ”λ° ν™”νλ‹¨μœ„κ°€ 500원, 400원, 100원이라면 졜적의 ν•΄λ₯Ό 보μž₯ν•  수 μ—†μŠ΅λ‹ˆλ‹€.

그리디 μ•Œκ³ λ¦¬μ¦˜ λ¬Έμ œμ—μ„œλŠ” 이처럼 문제 풀이λ₯Ό μœ„ν•œ μ΅œμ†Œν•œμ˜ 아이디어λ₯Ό λ– μ˜¬λ¦¬κ³  이것이 μ •λ‹Ήν•œμ§€ κ²€ν† ν•  수 μžˆμ–΄μ•Ό ν•©λ‹ˆλ‹€.

 

μ½”λ“œ 풀이

n = 1260
cnt = 0

# 큰 λ‹¨μœ„μ˜ 화폐뢀터 μ°¨λ‘€λŒ€λ‘œ ν™•μΈν•˜κΈ°
arr = [500, 100, 50, 10]

for i in arr:
  cnt = cnt + (n // i) # ν•΄λ‹Ή ν™”νλ‘œ 거슬러 쀄 수 μžˆλŠ” λ™μ „μ˜ 개수 μ„ΈκΈ°
  n = n % i # 거슬러주고 남은 λ‚˜λ¨Έμ§€
  
print(cnt)

 

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

  • ν™”νμ˜ μ’…λ₯˜κ°€ K라고 ν• λ•Œ, μ†ŒμŠ€μ½”λ“œμ˜ μ‹œκ°„ λ³΅μž‘λ„λŠ” O(K)μž…λ‹ˆλ‹€.
  • 이 μ•Œκ³ λ¦¬μ¦˜μ˜ μ‹œκ°„ λ³΅μž‘λ„λŠ” κ±°μŠ¬λŸ¬μ€˜μ•Ό ν•˜λŠ” κΈˆμ•‘κ³ΌλŠ” λ¬΄κ΄€ν•˜λ©°, λ™μ „μ˜ 총 μ’…λ₯˜μ—λ§Œ 영ν–₯을 λ°›μŠ΅λ‹ˆλ‹€.