๐ฉ๐ป ๊ทธ๋ฆฌ๋ ์๊ณ ๋ฆฌ์ฆ (Greedy Algorithm) ์ด๋?
๋งค ์๊ฐ ํ์ฌ ๊ธฐ์ค์ผ๋ก ์ต์ ์ ๋ต์ ์ ํํด ๋๊ฐ๋ ๊ธฐ๋ฒ
- ๋น ๋ฅด๊ฒ ๊ทผ์ฌ์น๋ฅผ ๊ณ์ฐํ ์ ์๋ค.
- ํ์ง๋ง ๊ฒฐ๊ณผ์ ์ผ๋ก ์ต์ ํด๊ฐ ์๋ ์ ์๋ค.
โ๏ธ ๊ทธ๋ฆฌ๋ ์๊ณ ๋ฆฌ์ฆ ์์
1) Activity Select Problem
- N๊ฐ์ ํ๋๊ณผ ๊ฐ ํ๋์ ์์/ ์ข ๋ฃ ์๊ฐ์ด ์ฃผ์ด์ก์ ๋,
- ํ ์ฌ๋์ด ์ต๋ํ ๋ง์ด ํ ์ ์๋ ํ๋์ ์ ๊ตฌํ๊ธฐ
: ๋งค ์๊ฐ ์ ํํ ์ ์๋ ๊ฒ ์ค์ ์ต์ ์ ์ ํ!
โจbut, ๊ทธ๋ฆฌ๋ ์๊ณ ๋ฆฌ์ฆ์ ํญ์ ์ต์ ํด๋ฅผ ์ฃผ์ง ์๋๋ค. ์๋์ ์ฌ์ง์ด ๊ทธ ์์ด๋ค.
๋ฐ๋ผ์ ๊ทธ๋ฆฌ๋ ์๊ณ ๋ฆฌ์ฆ์ ์ ์ฉ ์กฐ๊ฑด์ ์ดํด๋ณผ ํ์๊ฐ ์๋ค.
โ๏ธ ๊ทธ๋ฆฌ๋ ์๊ณ ๋ฆฌ์ฆ ์ ์ฉ ์กฐ๊ฑด
๊ทธ๋ฆฌ๋ ์๊ณ ๋ฆฌ์ฆ์ ๋น ๋ฅด์ง๋ง, ์ต์ ํด๋ฅผ ๋ณด์ฅํ์ง๋ ๋ชปํ๋ค. ๋ฐ๋ผ์ ์๋์ ๋ ๊ฐ์ง ์กฐ๊ฑด์ ํด๋นํ๋ ๊ฒฝ์ฐ ์ ์ฉ ๊ฐ๋ฅํ ์๊ณ ๋ฆฌ์ฆ์ด๋ค.
- ํ์์ ์ ํ ํน์ฑ (Greedy choice property)
- ์ง๊ธ ์ ํ์ด ๋ค์ ์ ํ์ ์ํฅ์ ์ฃผ์ง ์์ ๋
- ์ต์ ๋ถ๋ถ ๊ตฌ์กฐ (Optimal substructure)
- ์ ์ฒด ๋ฌธ์ ์ ์ต์ ํด๋ ๋ถ๋ถ ๋ฌธ์ ์ ์ต์ ํด๋ก ์ด๋ฃจ์ด์ง
์์ "์ต์ ๋ถ๋ถ ๊ตฌ์กฐ" ๋ฅผ ๋ง์กฑํ๋์ง ๊ตฌ๋ณํ๋ ์๋ฅผ ์์ ๊ฑฐ์ค๋ฆ๋ ๋ฌธ์ ๋ก ์ดํด๋ณด๋ฉด,
๊ฑฐ์ค๋ฆ๋ 890์ ๋์ ์ ๊ฐ์๊ฐ ๊ฐ์ฅ ์ ๊ฒ ํ๊ธฐ ์ํด์ ๋์ ์ข ๋ฅ๊ฐ 10,50,100,500 ์์ด ์๋ค๋ฉด ์ด๊ฒ์ ์ต์ ๋ถ๋ถ ๊ตฌ์กฐ๋ฅผ ๋ง์กฑํ๋ค.
์๋ํ๋ฉด 100์์ผ๋ก 500์์ ์ด๋ฃฐ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค. (10์๊ณผ 50์๋ ๋ง์ฐฌ๊ฐ์ง๋ก 100,500์์ ์ด๋ฃฐ ์ ์๋ค.)
๋ฐ๋ผ์ ์ด๋ฌํ ๋ฌธ์ ๋ ๊ทธ๋ฆฌ๋ ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ ์ ์๋ค.
ํ์ง๋ง, ๋์ ์ ์ข ๋ฅ๊ฐ 10,50,100,400,500์์ด ์๋ค๋ฉด ์์ ์์์ ๋ณธ ๊ฒ๊ณผ ๊ฐ์ด ๊ทธ๋ฆฌ๋ ์๊ณ ๋ฆฌ์ฆ์ด ์ต์ ํด๋ฅผ ๊ฐ์ง ๋ชปํ๋ค.
์ด๊ฒ์ 400์์ผ๋ก 500์์ ์ด๋ฃจ์ง ๋ชปํ์ง ๋๋ฌธ์ด๋ค. ๋ฐ๋ผ์ ์ด๋ฌํ ๊ฒฝ์ฐ์๋ ์ต์ ๋ถ๋ถ ๊ตฌ์กฐ๋ฅผ ๋ง์กฑํ์ง ๋ชปํ๋ ๊ฒฝ์ฐ๋ผ๊ณ ๋ณผ ์ ์๋ค.
๋ค๋ฅธ ์๋ฅผ ์ดํด๋ณด์.
๊ฐ์ฅ ๋ณดํธ์ ์ธ ๊ทธ๋ฆฌ๋ ์๊ณ ๋ฆฌ์ฆ์ ์์์ธ Activity Select Problem์์๋ ๊ทธ๋ฆฌ๋ ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉ ์กฐ๊ฑด์ ๋ณด์๋ฉด
์ ๋ ฌ์ด ๋์ง ์์ ํ์์๋ 2-3์ ์์ ๋ณด๋ค 1-5์ ์์ ์ด ๋จผ์ ์ด๋ฏ๋ก ํ์์ ์ ํ ํน์ฑ(์ง๊ธ ์ ํ์ด ๋ค์ ์ ํ์ ์ํฅ์ ์ฃผ์ง ์์)์ ๋ง์กฑํ์ง ๋ชปํ๋ค.
ํ์ง๋ง, ์ข ๋ฃ ์๊ฐ ๊ธฐ์ค์ผ๋ก ์ ๋ ฌํ๋ค๋ฉด ํ์์ ์ ํ ํน์ฑ์ ๋ง์กฑํ๋ค. ***
โ๏ธ Greedy Algorithm ๋ฌธ์ ํ์ด
1) Activity Select Problem
import java.util.ArrayList;
class Activity{
String name;
int start;
int end;
public Activity(String name, int start, int end){
this.name = name;
this.start = start;
this.end = end;
}
}
public class Main{
public static void selectActivity(ArrayList<Activity> list){
Collection.sort(list, (x1, x2) -> x1.end - x2.end); // ์ข
๋ฃ์๊ฐ ๊ธฐ์ค์ผ๋ก ์ ๋ ฌ
int curTime = 0;
ArrayList<Activity> result = new ArrayList<>();
for(Activity item : list){ // ๋นจ๋ฆฌ ์ข
๋ฃ๋๋ ์์ผ๋ก ์ ๋ ฌ๋์ด ์์ผ๋ฏ๋ก, ๋นจ๋ฆฌ ์ข
๋ฃ๋๋ ๊ฒ ๋จผ์ ๋์์ ๋น๊ต๋จ
if(curTiem <= item.start){
curTime = item.end;
result.add(item);
}
}
for(Activity item : result){
System.out.print(item.name + " ");
}
System.out.println();
}
}
2) ๊ฑฐ์ค๋ฆ๋ ๋ฌธ์
public class Main2{
public static void getChangeCoins(int receivedMoney, int price){
final int[] coins = {500, 100, 50, 10, 5, 1};
HashMap<Integer, Integer> result = new HashMap<>();
int change = receivedMoney - price;
int cnt = 0;
for(int i=0; i < coins.length; i++){
if(change < coins[i]){
continue;
}
int q = change / coins[i];
result.put(coins[i], result.getOrDefault(coins[i], 0) + q);
change %= coins[i];
cnt += q;
}
System.out.println("๊ฑฐ์ค๋ฆ๋ ๋์ ๊ฐ์ : " + cnt);
for(Map.Entry<Integer, Integer> cur : result.entrySet()){
System.out.println(cur.getKey() + " : " + cur.getValye());
}
}
}
'์๊ณ ๋ฆฌ์ฆ > ์๊ณ ๋ฆฌ์ฆ ์ด๋ก ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋ฐฑํธ๋ํน ์๊ณ ๋ฆฌ์ฆ (Backtracking) (0) | 2024.08.04 |
---|---|
๋ถํ ์ ๋ณต ์๊ณ ๋ฆฌ์ฆ (Divide and Conquer) (0) | 2024.08.02 |
ํฌ ํฌ์ธํฐ - ์๊ณ ๋ฆฌ์ฆ (2) | 2024.07.20 |
์ด์ง ํ์ - ์๊ณ ๋ฆฌ์ฆ (0) | 2024.07.20 |
์ ๋ ฌ (Sort) - ์๊ณ ๋ฆฌ์ฆ (0) | 2024.06.25 |