πŸ“• Algorithm/Algorithm

그리디 μ•Œκ³ λ¦¬μ¦˜ - ν˜„μž¬ μƒν™©μ—μ„œ κ°€μž₯ μ’‹μ•„λ³΄μ΄λŠ” 것을 선택

ν•œμ½”λ”© 2020. 11. 14. 03:17
728x90
728x90

그리디 μ•Œκ³ λ¦¬μ¦˜ (=νƒμš•λ²•)

μ–΄λ– ν•œ 문제λ₯Ό λ‹¨μˆœ λ¬΄μ‹ν•˜κ²Œ, νƒμš•μ μœΌλ‘œ 문제λ₯Ό ν‘ΈλŠ” μ•Œκ³ λ¦¬μ¦˜!

 

νƒμš•μ  ? ν˜„μž¬ μƒν™©μ—μ„œ μ§€κΈˆ λ‹Ήμž₯ 쒋은 κ²ƒλ§Œ κ³ λ₯΄λŠ” 방법!

 

그리디 μ•Œκ³ λ¦¬μ¦˜μ„ μ΄μš©ν•˜λ©΄ 맀 μˆœκ°„ κ°€μž₯ μ’‹μ•„ λ³΄μ΄λŠ” 것을 μ„ νƒν•˜λ©°, ν˜„μž¬μ˜ 선택이 λ‚˜μ€‘μ— λ―ΈμΉ  영ν–₯에 λŒ€ν•΄μ„œλŠ” κ³ λ €ν•˜μ§€ μ•ŠμŒ


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

'사전에 μ™Έμš°κ³  μžˆμ§€ μ•Šμ•„λ„ ν’€ 수 μžˆμ„ κ°€λŠ₯성이 높은 문제 μœ ν˜•!'

 

ex) μ—¬λŸ¬ 개의 데이터λ₯Ό λΉ λ₯΄κ²Œ μ •λ ¬ν•΄μ•Ό ν•˜λŠ” 문제 μ •λ ¬ 라이브러리 μ‚¬μš©!

     μ΅œλ‹¨ 경둜λ₯Ό λΉ λ₯΄κ²Œ μ°Ύμ•„μ•Ό ν•˜λŠ” 문제 ν”Œλ‘œμ΄λ“œ μ›Œμ…œ or λ‹€μ΅μŠ€νŠΈλΌ μ•Œκ³ λ¦¬μ¦˜ μ‚¬μš©!

 

λ”°λΌμ„œ, 그리디 μ•Œκ³ λ¦¬μ¦˜ μœ ν˜•μ„ λŒ€λΉ„ν•˜κΈ° μœ„ν•΄ λ§Žμ€ 문제λ₯Ό ν‘ΈλŠ”κ²Œ μž₯λ•‘

(창의λ ₯κ³Ό 아이디어λ₯Ό μš”κ΅¬ν•˜λŠ” 문제!)

 

κΈ°μ€€ ? ex) "κ°€μž₯ 큰 μˆœμ„œλŒ€λ‘œ" / "κ°€μž₯ μž‘μ€ μˆœμ„œλŒ€λ‘œ" 이와 같은 기쀀을 톡해 μ΅œμ ν•΄λ₯Ό μ°Ύμ•„μ•Ό ν•œλ‹€.


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

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

 

"그리디 μ•Œκ³ λ¦¬μ¦˜μ˜ λŒ€ν‘œ 문제!!"

 

아이디어 ? "κ°€μž₯ 큰 화폐 λ‹¨μœ„λΆ€ν„° 거슬러주자!"

 

500원 →100원 → 50원 → 10원 μˆœμ„œλŒ€λ‘œ

 

ex) N = 1260원

 

1. 500원

1260원 >= 500원 x 2 → λ”°λΌμ„œ, 500원 2개 거슬러주자

 

2. 100원

260원 >= 100원 x 2 → λ”°λΌμ„œ, 100원 2개 거슬러주자

 

3. 50원

60원 >= 50원 x 1 → λ”°λΌμ„œ, 50원 1개 거슬러주자

 

3. 10원

10원 >= 10원 x 1 → λ”°λΌμ„œ, 10원 1개 거슬러주자. 그럼 끝!

 

그러면 이런 문제λ₯Ό μ†ŒμŠ€μ½”λ“œλ‘œ μž‘μ„±ν•˜λ©΄ μ–΄λ–»κ²Œ μž‘μ„±ν•΄μ•Ό ν• κΉŒ?

 

#include <iostream>
#include <vector>

using namespace std;

int main(void) {
	int N = 1260, res = 0;
	vector<int> coin = { 500, 100, 50, 10 };

	for (int i = 0; i < 4; i++) {
		res += N / coin[i];
		N %= coin[i];
	}

	cout << "동전 갯수 : " << res << "개";
} 

직접 κ΅¬ν˜„ν•œ μ½”λ“œλ₯Ό 보면 어렡지 μ•Šκ²Œ κ΅¬ν˜„ν•  수 μžˆλ‹€. 

 

ν™”νμ˜ μ’…λ₯˜μ— 따라 λ°˜λ³΅λ¬Έμ„ 돌리고, 각 ν™”νλ‘œ 총 κΈˆμ•‘μ„ λͺ« μ—°μ‚°ν•˜λ©΄ κ±°μŠ¬λŸ¬μ€˜μ•Όν•  동전 κ°―μˆ˜κ°€ λ‚˜μ˜¨λ‹€.

 

λ˜ν•œ, 거슬러주고 λ‹€μŒ μž‘μ€ 화폐 λ‹¨μœ„λ‘œ λ„˜μ–΄κ°€κΈ° μœ„ν•΄ κ±°μŠ¬λŸ¬μ€€ ν›„ κΈˆμ•‘μ„ μ μš©ν•˜κΈ° μœ„ν•΄ λ‚˜λ¨Έμ§€ 연산을 ν•œλ‹€.


그리디 μ•Œκ³ λ¦¬μ¦˜μ˜ μ •λ‹Ήμ„±

그리디 μ•Œκ³ λ¦¬μ¦˜μ„ λͺ¨λ“  μ•Œκ³ λ¦¬μ¦˜ λ¬Έμ œμ— μ μš©ν•  수 μ—†λ‹€!

 

→ 그리디 μ•Œκ³ λ¦¬μ¦˜ 문제의 해법을 μ°Ύμ•˜μ„ 경우, κ·Έ 해법이 μ •λ‹Ήν•œμ§€ κ²€ν† ν•΄μ•Όν•œλ‹€! μœ„μ™€ 같은 예제λ₯Ό 보면,

 

'가진 동전 μ€‘μ—μ„œ 큰 λ‹¨μœ„κ°€ 항상 μž‘μ€ λ‹¨μœ„μ˜ λ°°μˆ˜μ΄λ―€λ‘œ μž‘μ€ λ‹¨μœ„μ˜ 동전듀을 μ’…ν•©ν•΄ λ‹€λ₯Έ ν•΄κ°€ λ‚˜μ˜¬ 수 μ—†κΈ° λ•Œλ¬Έ'

 

ex) 800원을 κ±°μŠ¬λŸ¬μ€„ λ•Œ, ν™”νλ‹¨μœ„κ°€ [500, 400,100] 인 경우일 λ•Œ, μœ„μ™€ 같은 μ†ŒμŠ€μ½”λ“œλ‘œ 돌리면 동전 κ°―μˆ˜λŠ” 4κ°œκ°€ λ‚˜μ˜¨λ‹€. ν•˜μ§€λ§Œ, 800 = 400 + 400μ΄λ―€λ‘œ λ˜λ‹€λ₯Έ μ΅œμ ν•΄κ°€ λ‚˜μ˜¨λ‹€. 닡은 동전 갯수 2개.

 

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

 

→ λ§Œμ•½, μ½”λ”© ν…ŒμŠ€νŠΈμ—μ„œ μ–΄λ–€ 문제 μœ ν˜•μΈμ§€ νŒŒμ•…ν•˜κΈ° μ–΄λ ΅λ‹€λ©΄ μš°μ„  '그리디 μ•Œκ³ λ¦¬μ¦˜'을 μ˜μ‹¬ν•˜λΌ!

 

μ˜μ‹¬ μˆœμ„œ : 그리디 → λ‹€μ΄λ‚˜λ―Ή → κ·Έλž˜ν”„

 

 

 

 

 

좜처 : 이것이 취업을 μœ„ν•œ μ½”λ”©ν…ŒμŠ€νŠΈλ‹€ with 파이썬 : μ·¨μ—…κ³Ό 이직을 κ²°μ •ν•˜λŠ” μ•Œκ³ λ¦¬μ¦˜ 인터뷰 μ™„λ²½ κ°€μ΄λ“œ

 

 

728x90
λ°˜μ‘ν˜•