μ½”λ”©ν…ŒμŠ€νŠΈ/μ•Œκ³ λ¦¬μ¦˜

[C++ μ•Œκ³ λ¦¬μ¦˜] 그리디(νƒμš•λ²•,Greedy Algorithm)

kite707 2021. 8. 8.

κ°œλ…

그리디 μ•Œκ³ λ¦¬μ¦˜μ€ κ°œλ…μ€ ꡉμž₯히 λ‹¨μˆœν•˜λ‹€. 말 κ·ΈλŒ€λ‘œ νƒμš•μ μœΌλ‘œ, 눈 μ•žμ˜ κ°€μž₯ 큰 이읡을 μΆ”κ΅¬ν•˜λŠ” 기법이닀. μ‹€μ œ 그리디 μ•Œκ³ λ¦¬μ¦˜μ„ κ²€μƒ‰ν•˜λ©΄ μ•„λž˜μ™€ 같이 λ‚˜μ˜¨λ‹€.

νƒμš• μ•Œκ³ λ¦¬μ¦˜μ€ μ΅œμ ν•΄λ₯Ό κ΅¬ν•˜λŠ” 데에 μ‚¬μš©λ˜λŠ” 근사적인 λ°©λ²•μœΌλ‘œ, μ—¬λŸ¬ 경우 쀑 ν•˜λ‚˜λ₯Ό κ²°μ •ν•΄μ•Ό ν•  λ•Œλ§ˆλ‹€ κ·Έ μˆœκ°„μ— 졜적이라고 μƒκ°λ˜λŠ” 것을 선택해 λ‚˜κ°€λŠ” λ°©μ‹μœΌλ‘œ μ§„ν–‰ν•˜μ—¬ μ΅œμ’…μ μΈ 해닡에 λ„λ‹¬ν•œλ‹€.

일반적으둜 μƒκ°ν–ˆμ„ λ•Œ λˆˆμ•žμ˜ μ΄μ΅λ§Œμ„ μ«“λŠ” 것이 졜적의 μ„ νƒμ΄λΌκ³ λŠ” ν•  수 μ—†λ‹€. κ°€λ Ή μ•„λž˜μ™€ 같은 상황이 μžˆλ‹€κ³  μƒκ°ν•΄λ³΄μž. 


예제 1

각 그림의 적힌 μˆ«μžλŠ” 문제λ₯Ό ν‘ΈλŠ”λ° κ±Έλ¦¬λŠ” μ‹œκ°„μ΄κ³  μš°λ¦¬λŠ” κ°€μž₯ λΉ λ₯Έ μ‹œκ°„μ•ˆμ— level1, level2, level3문제λ₯Ό ν•˜λ‚˜μ”© ν•΄κ²°ν•˜λ € ν•œλ‹€. μ΄λ•Œ 문제λ₯Ό ν‘ΈλŠ” μ‹œκ°„μ„ μ΅œμ†Œν™” ν•˜λ €λ©΄ μ–΄λ–»κ²Œ ν•΄μ•Ό ν• κΉŒ?

 

μ•žμ„œ μ„€λͺ…ν–ˆλ“―이 κ·Έλ¦¬λ””λŠ” λ’· 상황은 μƒκ°ν•˜μ§€ μ•ŠλŠ”λ‹€. λ‹¨μˆœνžˆ 눈 μ•žμ˜ μ΄μ΅λ§Œμ„ μΆ”κ΅¬ν•˜λŠ” μ•Œκ³ λ¦¬μ¦˜μ΄λ‹€. κ·Έλž˜μ„œ 그리디 μ•Œκ³ λ¦¬μ¦˜μ„ μ μš©ν•œλ‹€λ©΄ μ•„λž˜μ™€ 같이 될 것이닀. 총 45뢄이 μ†Œμš”λœλ‹€.

κ·Έλ ‡μ§€λ§Œ μ‹€μ œλ‘œ 문제λ₯Ό ν‘ΈλŠ” μ‹œκ°„μ„ μ΅œμ†Œν™” ν•˜λŠ” 방법은 μ•„λž˜μ™€ κ°™λ‹€. 42뢄이 μ†Œμš”λœλ‹€.

μ—¬κΈ°κΉŒμ§€ 봀을 λ•Œμ—λŠ” 그리디 μ•Œκ³ λ¦¬μ¦˜μ„ λ„λŒ€μ²΄ μ–΄λ””λ‹€ μ“°λ‚˜ 싢을 μˆ˜λ„ μžˆλ‹€. κ·ΈλŸ¬λ‚˜ 이 μ•Œκ³ λ¦¬μ¦˜μ€ λ‹¨μˆœν•œλ§ŒνΌ μ‹€ν–‰ μ‹œκ°„μ΄ λΉ λ₯΄λ‹€. 그리디 문제λ₯Ό μ„€λͺ…ν•˜λŠ” κ°€μž₯ λŒ€ν‘œμ μΈ μ˜ˆμ‹œλŠ” λ™μ „λ¬Έμ œμ΄λ‹€. μ•„λž˜ 문제λ₯Ό 풀어보도둝 ν•˜μž.


예제 2

500원, 100원, 10원 동전이 무수히 λ§Žλ‹€κ³  κ°€μ •ν•  λ•Œ κ°€μž₯ 적은 수의 동전을 μ΄μš©ν•΄μ„œ 1410원을 λ§Œλ“ λ‹€κ³  ν•˜μž. μ΄λ•Œ μ‚¬μš©ν•˜λŠ” λ™μ „μ˜ κ°œμˆ˜λŠ” λͺ‡κ°œμΈκ°€? 

 

이 문제λ₯Ό μ ‘ν–ˆλ‹€λ©΄ 일반적으둜 500원을 μ‚¬μš©ν•  수 μžˆλŠ” ν•œλ„κΉŒμ§€ μ‚¬μš©ν•  것이닀. κ·Έλž˜μ„œ 500μ›μ§œλ¦¬ 2개둜 1000원을 λ§Œλ“€κ³ , 100μ›μ§œλ¦¬ 4개둜 400원을, 10원 동전 1개둜 10원을 λ§Œλ“€μ–΄ 1410원을 μ™„μ„±ν•  것이닀. κ·Έλž˜μ„œ 이 문제의 닡은 7κ°œμ΄λ‹€. 이 λ¬Έμ œμ—λŠ” 그리디 μ•Œκ³ λ¦¬μ¦˜μ΄ μ‚¬μš©λ˜μ—ˆλ‹€. μ“Έ 수 μžˆλŠ” 동전 쀑 κ°€μž₯ μ•‘μˆ˜κ°€ 큰 것뢀터 μˆœμ„œλŒ€λ‘œ μ‚¬μš©ν•΄ λ‚˜κ°„ 것이닀. 이 행동을 λ°˜λ³΅ν•˜λ©΄ 문제λ₯Ό ν’€μ–΄λ‚Ό 수 μžˆλ‹€.

 

이 문제λ₯Ό μœ„μ™€ 같이 λ‹¨μˆœν•œ λ°©λ²•μœΌλ‘œ ν’€μ–΄λ‚Ό 수 μžˆλŠ” μ΄μœ λŠ” μž‘μ€ μ•‘μˆ˜ 동전이 큰 μ•‘μˆ˜ λ™μ „μ˜ μ•½μˆ˜μ΄κΈ° λ•Œλ¬Έμ΄λ‹€. 즉, 100원 5개둜 λ§Œλ“€μˆ˜ μžˆλŠ” μ•‘μˆ˜λŠ” 500원 동전 ν•œκ°œλ‘œ λ§Œλ“€ 수 μžˆλ‹€. κ·Έλ ‡κΈ° λ•Œλ¬Έμ— 큰 μ•‘μˆ˜μ˜ 동전뢀터 μ‚¬μš©ν•΄ λ‚˜κ°€λ©΄ κ°€μž₯ 적은 동전을 μ‚¬μš©ν•œλ‹€κ³  보μž₯ν•  수 μžˆλŠ” 것이닀.


정리λ₯Ό ν•΄λ³΄μžλ©΄ 그리디 μ•Œκ³ λ¦¬μ¦˜μ€ νŠΉμ • μƒν™©μ—μ„œλ§Œ μ‚¬μš©ν•  수 μžˆλ‹€. 즉 그리디λ₯Ό μ‚¬μš©ν•œ 방법이 μ •λ‹΅μ΄λΌλŠ” 보μž₯이 λ˜μ–΄μ•Ό μ‚¬μš©ν•  수 μžˆλ‹€. μœ„μ—μ„œ 봀듯이 예제 2의 경우 동전간에 배수, μ•½μˆ˜ 관계가 μ„±λ¦½ν–ˆκΈ° λ•Œλ¬Έμ— 그리디λ₯Ό μ‚¬μš©ν•  수 μžˆμ—ˆλ‹€. 만일 500원 400원 100원 λ™μ „μœΌλ‘œ 2800원을 λ§Œλ“ λ‹€κ³  κ°€μ •ν•΄λ³΄μž. μœ„μ—μ„œ ν•œ λ°©μ‹λŒ€λ‘œ 500원 동전뢀터 μ‚¬μš©μ„ ν•œλ‹€λ©΄ 500원 5개, 100원 3개λ₯Ό μ΄μš©ν•΄ 총 8개의 동전을 μ‚¬μš©ν•œλ‹€. ν•˜μ§€λ§Œ κ°€μž₯ 동전을 적게 μ‚¬μš©ν•˜λŠ” 방법은 500원 동전을 4개, 400원 동전을 2개, 총 6개의 동전을 μ‚¬μš©ν•˜λŠ” 방법이닀. κ·Έλž˜μ„œ μ•žμ—μ„œ λ§ν–ˆλ“― 그리디λ₯Ό μ‚¬μš©ν•˜λ €λ©΄ 이 방법이 μ΅œμ„ μ΄λ‹€ λΌλŠ” κ·Όκ±°κ°€ μžˆμ–΄μ•Ό ν•œλ‹€.

 

κ·Έλž˜μ„œ λͺ¨λ‘ κ·ΈλŸ°κ²ƒμ€ μ•„λ‹ˆμ§€λ§Œ 그리디 λ¬Έμ œλŠ” 일반적으둜 μ΅œλŒ€ν•œ 적은, μ΅œλŒ€ν•œ λ§Žμ€ μ΄λΌλŠ” 문ꡬ가 λ¬Έμ œμ— λ“€μ–΄κ°€λŠ” κ²½μš°κ°€ λ§Žλ‹€. μ΅œλŒ€/μ΅œμ†Œμ˜ 경우의 수λ₯Ό ꡬ할것을 μš”κ΅¬ν•˜λŠ” λ¬Έμ œλ“€μ΄λ‹€. 그리고 그리디λ₯Ό μ‚¬μš©ν•  수 μžˆλŠ” 쑰건이 주어진닀. μœ„ λ™μ „λ¬Έμ œλŠ” λ‹¨μˆœν•œ μ˜ˆμ‹œμ§€λ§Œ λ™μ „κ°„μ˜ 배수, μ•½μˆ˜ 관계가 κ·Έ 쑰건이닀. λ¬Όλ‘  μ΄λŸ¬ν•œ 쑰건은 문제 내에 μˆ¨κ²¨μ Έμžˆμ–΄ μ°Ύμ•„λ‚΄μ•Ό ν•˜λŠ” κ²½μš°κ°€ λ§Žλ‹€.

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


1. 일반적으둜 μ΅œλŒ€ν•œ 적은, μ΅œλŒ€ν•œ λ§Žμ€ μ΄λΌλŠ” 문ꡬ가 λ¬Έμ œμ— λ“€μ–΄κ°€λŠ” κ²½μš°κ°€ λ§Žλ‹€. μ΅œλŒ€/μ΅œμ†Œμ˜ 경우의 수λ₯Ό ꡬ할것을 μš”κ΅¬ν•˜λŠ” λ¬Έμ œλ“€μ΄λ‹€.

2. 그리디λ₯Ό μ‚¬μš©ν•  수 μžˆλŠ” 쑰건이 주어진닀. (주둜 문제λ₯Ό 읽고 쑰건을 μ°Ύμ•„μ•Όν•œλ‹€.)

3.정렬을 ν•œ λ’€ 그것을 μ΄μš©ν•΄ ν‘ΈλŠ” λ¬Έμ œκ°€ λ§Žλ‹€. (μœ„ λ™μ „λ¬Έμ œμ˜ κ²½μš°μ—λ„ 동전을 λ‚΄λ¦Όμ°¨μˆœμœΌλ‘œ μ •λ ¬ν•œ λ’€ ν•˜λ‚˜ ν•˜λ‚˜ μ‚¬μš©ν•΄ λ‚˜κ°€μ•Ό ν•  것이닀.)

λ§ˆμ§€λ§‰μœΌλ‘œ μ•„λž˜ 문제λ₯Ό 보도둝 ν•˜μž.

 

이 λ¬Έμ œλŠ” λ‚˜λ™λΉˆλ‹˜μ˜ κ°•μ˜ μ˜μƒμ—μ„œ λ‚˜μ˜€λŠ” λ¬Έμ œμ΄λ‹€.

https://www.youtube.com/watch?v=2zjoKjt97vQ&t=1913s 

이 문제 μ—­μ‹œ κ·Έλ¦¬λ””λ‘œ ν’€μ–΄λ‚Ό 수 μžˆλŠ”λ° κ·Έ μ΄μœ λŠ” Nμ—μ„œ 1을 λΉΌλŠ” 것 보닀 K둜 λ‚˜λˆ„λŠ” 것이 더 빨리 1을 λ§Œλ“€ 수 μžˆλ‹€λŠ” 것이 보μž₯되기 λ•Œλ¬Έμ΄λ‹€. 즉 K둜 λ‚˜λˆ μ§ˆ λ•Œλ§ˆλ‹€ λ‚˜λˆ„κ³ , 그것이 λ˜μ§€ μ•ŠμœΌλ©΄ 1을 λΉΌλŠ”κ²ƒμ„ λ°˜λ³΅ν•˜λ©΄ λ˜λŠ” 것이닀.

 

같이 ν’€λ©΄ 쒋은 문제

문제λ₯Ό 많이 ν’€μ–΄λ³΄λ©΄μ„œ "μ΄λŸ°κ²ƒμ΄ κ·Έλ¦¬λ””κ΅¬λ‚˜" ν•˜λŠ” 감을 μ΅ν˜€κ°€λŠ” 것이 쒋을 것 κ°™λ‹€.

 

 

μ•„λž˜ 두 λ¬Έμ œλŠ” κ·Έλ¦¬λ””λΌλŠ” κ²ƒλ§Œ μ•Œλ©΄  어렡지 μ•Šκ²Œ ν’€μ–΄λ‚Ό 수 μžˆλ‹€.

https://www.acmicpc.net/problem/4796

 

4796번: μΊ ν•‘

μž…λ ₯은 μ—¬λŸ¬ 개의 ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€λ‘œ 이루어져 μžˆλ‹€. 각 ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€λŠ” ν•œ μ€„λ‘œ 이루어져 있고, L, P, Vλ₯Ό μˆœμ„œλŒ€λ‘œ ν¬ν•¨ν•˜κ³  μžˆλ‹€. λͺ¨λ“  μž…λ ₯ μ •μˆ˜λŠ” intλ²”μœ„μ΄λ‹€. λ§ˆμ§€λ§‰ μ€„μ—λŠ” 0이 3개 주어진닀.

www.acmicpc.net

 

https://www.acmicpc.net/problem/2839

 

2839번: 섀탕 배달

μƒκ·Όμ΄λŠ” μš”μ¦˜ 섀탕곡μž₯μ—μ„œ 섀탕을 λ°°λ‹¬ν•˜κ³  μžˆλ‹€. μƒκ·Όμ΄λŠ” μ§€κΈˆ μ‚¬νƒ•κ°€κ²Œμ— 섀탕을 μ •ν™•ν•˜κ²Œ Nν‚¬λ‘œκ·Έλž¨μ„ 배달해야 ν•œλ‹€. 섀탕곡μž₯μ—μ„œ λ§Œλ“œλŠ” 섀탕은 봉지에 담겨져 μžˆλ‹€. λ΄‰μ§€λŠ” 3ν‚¬λ‘œκ·Έ

www.acmicpc.net


그리디 문제 νŠΉμ„±μƒ μ–΄λ–»κ²Œ ν•΄μ•Ό μ΅œμ ν•΄λ₯Ό ꡬ할 수 μžˆμ„κΉŒ?λ₯Ό 많이 κ³ λ―Όν•΄ 보며 ν’€μ–΄μ•Ό ν•œλ‹€. μ•„λž˜ 문제 μ—­μ‹œ λ§ˆμ°¬κ°€μ§€μ΄λ‹€. 1 1κ³Ό 같이 μ‹œμž‘ν•˜λŠ” μ‹œκ°„κ³Ό λλ‚˜λŠ” μ‹œκ°„μ΄ 같을 κ²½μš°λ„ μžˆλ‹€λŠ” 것을 κ³ λ €ν•˜λ©° 문제λ₯Ό ν’€μ–΄λ³΄μž. 또 μ–΄λ–€ κΈ°μ€€μœΌλ‘œ μ •λ ¬ν•˜λŠ”κ²ƒμ΄ 쒋을지 κ³ λ―Όν•΄λ³΄μž.

 

https://www.acmicpc.net/problem/1931

 

1931번: νšŒμ˜μ‹€ λ°°μ •

(1,4), (5,7), (8,11), (12,14) λ₯Ό μ΄μš©ν•  수 μžˆλ‹€.

www.acmicpc.net

 

 

λŒ“κΈ€