JiYoung Dev πŸ–₯

[파이썬] μ•Œκ³ λ¦¬μ¦˜ νŒ¨λŸ¬λ‹€μž„ : 그리디 μ•Œκ³ λ¦¬μ¦˜ Greedy Algorithm λ³Έλ¬Έ

python

[파이썬] μ•Œκ³ λ¦¬μ¦˜ νŒ¨λŸ¬λ‹€μž„ : 그리디 μ•Œκ³ λ¦¬μ¦˜ Greedy Algorithm

Shinjio 2023. 3. 1. 18:05

2023.03.01 μ½”λ“œμž‡ ν•™μŠ΅λ‚΄μš©

 

πŸ”Ž 그리디 μ•Œκ³ λ¦¬μ¦˜(Greedy Algorithm)

greedyλŠ” νƒμš•μ΄λΌλŠ” 뜻.

그리디 μ•Œκ³ λ¦¬μ¦˜(Greedy Algorithm)은 λ―Έλž˜λ₯Ό 내닀보지 μ•Šκ³ , λ‹Ήμž₯ λˆˆμ•žμ— λ³΄μ΄λŠ” 졜적의 선택을 ν•˜λŠ” 방식

그리디 μ•Œκ³ λ¦¬μ¦˜μ€ κ°„λ‹¨ν•˜κ³  λΉ λ₯΄λ‹€λŠ” μž₯점이 μžˆμœΌλ‚˜ μˆœκ°„λ§ˆλ‹€ 졜적의 선택을 ν•˜λŠ” 경우 κ·Έ μˆœκ°„μ— λŒ€ν•΄μ„œλŠ” μ΅œμ μ΄μ§€λ§Œ, μ΅œμ’…μ μΈ 닡을 λ§Œλ“€μ—ˆμ„ λ•Œμ—λŠ” κ·Έ 닡이 졜적이 아닐 수 있음. 즉, 졜적의 닡이 보μž₯λ˜μ§€ μ•ŠλŠ”λ‹€λŠ” 단점이 있음.  

 

πŸ“– 그리디 μ•Œκ³ λ¦¬μ¦˜μ„ μ‚¬μš©ν•˜λŠ” 경우

1. 문제λ₯Ό ν•΄κ²°ν•˜λŠ” λ‹€λ₯Έ μ•Œκ³ λ¦¬μ¦˜μ΄ λ„ˆλ¬΄ λŠλ €μ„œ μ‚¬μš©ν•  수 μ—†λŠ” μˆ˜μ€€μΌ λ•Œ

2. μ• μ΄ˆλΆ€ν„° 졜적의 닡이 ν•„μš” 없을 λ•Œ μ‚¬μš©

3. μˆœκ°„μ˜ 졜적의 선택이 μ΅œμ’… λ‹΅μ—μ„œλ„ 졜적의 선택이 λ˜λŠ” 경우

 

3번과 같이 그리디 μ•Œκ³ λ¦¬μ¦˜μ΄ 졜적의 닡을 κ΅¬ν•΄μ£ΌλŠ” 경우의 쑰건 2가지

1. 졜적 λΆ€λΆ„ ꡬ쑰(optimal substructure)λ₯Ό κ°–μΆ”κ³  μžˆλ‹€. → μ΄λŠ” 그리디 μ•Œκ³ λ¦¬μ¦˜μ„ μ‚¬μš©ν•˜λ € ν•  λ•Œμ˜ ν•„μˆ˜μ‘°κ±΄

졜적 λΆ€λΆ„ ꡬ쑰λ₯Ό 가지고 μžˆλ‹€λŠ” 것은 λΆ€λΆ„ λ¬Έμ œλ“€μ˜ 졜적의 닡을 μ΄μš©ν•΄μ„œ κΈ°μ‘΄ 문제의 졜적의 닡을 ꡬ할 수 μžˆλ‹€λŠ” 것

2. νƒμš•μ  선택 속성 (greedy choice property) μ΄λŠ” ν•„μˆ˜μ‘°κ±΄μ€ μ•„λ‹ˆμ§€λ§Œ 졜적의 닡을 κ΅¬ν•˜κΈ° μœ„ν•΄μ„œλŠ” λ§Œμ‘±ν•΄μ•Ό 함

각 λ‹¨κ³„μ—μ„œμ˜ νƒμš•μŠ€λŸ¬μš΄ 선택이 μ΅œμ’… 닡을 κ΅¬ν•˜κΈ° μœ„ν•œ 졜적의 선택인 경우

 

πŸ“– 그리디 μ•Œκ³ λ¦¬μ¦˜ μ—°μŠ΅λ¬Έμ œ

βš™ μ΅œμ†Œ 개수의 λ™μ „μœΌλ‘œ 돈 거슬러 μ£ΌκΈ°

β–Όβ–Όβ–Ό λͺ¨λ²” λ‹΅μ•ˆ β–Όβ–Όβ–Ό

 

 

β–Όβ–Όβ–Ό λ‚΄κ°€ μž‘μ„±ν•œ μ½”λ“œ β–Όβ–Όβ–Ό

차이점 : sorted λŒ€μ‹  sortλ₯Ό μ‚¬μš©ν•˜μ˜€κ³ , value값을 직접 계산

κ°œμ„ μ  : for 문에 sorted(coin_list, reverse=True)λ₯Ό λ„£μœΌλ©΄ μ½”λ“œ ν•œ 쀄이 쀄어듀고, valueλŠ” valueμ—μ„œ coin을 λ‚˜λˆˆ λ‚˜λ¨Έμ§€λ‘œ %=둜 μ‰½κ²Œ μž‘μ„± κ°€λŠ₯

 

 

βš™ ν•œ μ‚¬λžŒλ‹Ή μΉ΄λ“œ ν•˜λ‚˜μ”© λ½‘μ•„μ„œ λͺ¨λ‘ κ³±ν–ˆμ„ λ•Œ κ°€λŠ₯ν•œ μ΅œλŒ€κ³± κ΅¬ν•˜κΈ°

β–Όβ–Όβ–Ό λͺ¨λ²” λ‹΅μ•ˆ β–Όβ–Όβ–Ό

 

 

β–Όβ–Όβ–Ό λ‚΄κ°€ μž‘μ„±ν•œ μ½”λ“œ β–Όβ–Όβ–Ό

κ°œμ„ ν• μ  : μ½”λ“œλ₯Ό 더 보기 μ’‹κ³  κ°„λ‹¨ν•˜κ²Œ 쀄일 수 있으면 쀄이기. max_elementλŠ” ꡳ이 ν•„μš”ν•œ λ³€μˆ˜κ°€ μ•„λ‹˜. λ°”λ‘œ λŒ€μž…ν•˜μ—¬ μž‘μ„±ν•˜λŠ” 게 더 보기 μ’‹μŒ

 

 

βš™ κ°€μž₯ 적게 λ‚΄λŠ” 경우의 벌금 κ΅¬ν•˜κΈ°

β–Όβ–Όβ–Ό λͺ¨λ²” λ‹΅μ•ˆ β–Όβ–Όβ–Ό

μ •λ ¬λœ 리슀트λ₯Ό μƒˆλ‘­κ²Œ μ •μ˜ν•œ ν›„ 인덱슀 μˆœμ„œλŒ€λ‘œ 반볡문 진행

 

 

β–Όβ–Όβ–Ό λ‚΄κ°€ μž‘μ„±ν•œ μ½”λ“œ β–Όβ–Όβ–Ό

차이점 : for λ°˜λ³΅λ¬Έμ„ μΈλ±μŠ€κ°€ μ•„λ‹Œ μš”μ†Œλ‘œ 진행. λŒ€μ‹  iλ₯Ό λ³€μˆ˜λ‘œ μ§€μ •ν•˜μ˜€κ³ , λ°˜λ³΅λ¬Έμ—μ„œ i += 1이 싀행될 수 있게 μž‘μ„±ν•˜μ˜€μŒ

 

βš™ κ°€μž₯ λ§Žμ€ μˆ˜μ—… λ‹΄κΈ°

β–Όβ–Όβ–Ό λͺ¨λ²” λ‹΅μ•ˆ β–Όβ–Όβ–Ό

 

β‘  course_listλ₯Ό νŠœν”Œμ˜ 1번 인덱슀λ₯Ό κΈ°μ€€μœΌλ‘œ μ˜€λ¦„μ°¨μˆœ μ •λ ¬

μ •λ ¬ 쑰건 μ§€μ •ν•˜κΈ°
νŒŒμ΄μ¬μ—μ„œλŠ” sort()와 sorted()λ₯Ό μ‚¬μš©ν•˜μ—¬ 정렬을 ν•  수 μžˆλŠ”λ°, 인자둜 key=lambda x : x[0] 등을 μ£Όμ–΄ μ •λ ¬ 쑰건을 지정할 수 있음. μ•„λž˜μ˜ μ½”λ“œμ—μ„œ sorted(list, key = lambda x : x[1]λŠ” νŠœν”Œμ˜ 1번 인덱슀λ₯Ό κΈ°μ€€μœΌλ‘œ μ •λ ¬ν•œλ‹€λŠ” 뜻
λ˜ν•œ, x : (x[1], x[0]) 이런 μ‹μœΌλ‘œ μž‘μ„±ν•˜λ©΄ μš°μ„ μ‘°κ±΄κ³Ό 차선쑰건을 지정할 수 있음. μ•žμ— μžˆλŠ” 게 μš°μ„ μ‘°κ±΄

 

β‘‘ 결괏값을 λ¦¬ν„΄ν•˜κ³ μž ν•˜λŠ” μƒˆλ‘œμš΄ 리슀트λ₯Ό μƒμ„±ν•˜κ³  λ¦¬μŠ€νŠΈμ—λŠ” λλ‚˜λŠ” μ‹œκ°„μ΄ κ°€μž₯ μž‘μ€ νŠœν”Œμ„ λ„£μ–΄ λ†“μŒ

β‘’ μƒˆλ‘œ μ •λ ¬λœ 리슀트의 각 νŠœν”Œ μš”μ†Œλ³„λ‘œ μ•„λž˜μ˜ 쑰건 확인

 

 

β–Όβ–Όβ–Ό λ‚΄κ°€ μž‘μ„±ν•œ μ½”λ“œ β–Όβ–Όβ–Ό

차이점 : λͺ¨λ²”λ‹΅μ•ˆμ—μ„œλŠ” forλ°˜λ³΅λ¬Έμ„ 인덱슀 λ²ˆν˜Έκ°€ μ•„λ‹Œ μš”μ†Œλ‘œ μ§€μ •ν•˜μ—¬ μ‚¬μš©ν•˜μ˜€μŒ. μš”μ†Œλ₯Ό μ‚¬μš©ν•  경우 더 κΉ”λ”ν•œ μ½”λ“œ μž‘μ„± κ°€λŠ₯. λ˜ν•œ, 쑰건식도 더 κ°„λ‹¨ν•˜κ²Œ μž‘μ„±ν•  수 있음.