contents
๐ช ์ฝ๋ฉ ํ ์คํธ๋ฅผ ์ํ ๊ทธ๋ฆฌ๋(Greedy) ์๊ณ ๋ฆฌ์ฆ ๊ฐ์ด๋
1. ๊ทธ๋ฆฌ๋ ์๊ณ ๋ฆฌ์ฆ์ด๋?
๊ทธ๋ฆฌ๋ ์๊ณ ๋ฆฌ์ฆ(Greedy Algorithm) ์ ์ต์ ํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ๋ ๊ฐ ๋จ๊ณ์์ ๊ทธ ์๊ฐ ๊ฐ์ฅ ์ข์ ๋ณด์ด๋ ์ ํ(๊ตญ์ ์ต์ , Local Optimal) ์ ํ๋ ๋ฐฉ๋ฒ์ ๋๋ค. ์ด์ ๊ฒฐ์ ์ ๋๋๋ฆฌ์ง ์๊ณ (๋ฐฑํธ๋ํน ์์) ๋งค ๋จ๊ณ ์ ํ์ ํ์ ํด ๋๊ฐ๋๋ค.
- ํน์ง
- ๊ทธ๋ฆฌ๋ ์ ํ ์์ฑ(Greedy Choice Property): ๊ฐ ๋จ๊ณ์์ ์ต์ ์ ์ ํ์ด ์ ์ฒด ์ต์ ํด๋ก ์ด์ด์ง
- ์ต์ ๋ถ๋ถ ๊ตฌ์กฐ(Optimal Substructure): ๋ถ๋ถ ๋ฌธ์ ๋ค์ ์ต์ ํด๋ฅผ ์กฐํฉํด ์ ์ฒด ๋ฌธ์ ์ ์ต์ ํด๋ฅผ ๊ตฌ์ฑ ๊ฐ๋ฅ
- ํ๊ณ
- ๋ชจ๋ ๋ฌธ์ ์์ ํญ์ ์ต์ ํด๋ฅผ ๋ณด์ฅํ์ง ์์
- 0/1 ๋ฐฐ๋ญ ๋ฌธ์ , ์ธํ์ ์ํ(TSP) ๋ฑ์์๋ DP๋ ์์ ํ์์ด ํ์ํ ์ ์์
2. ๊ทธ๋ฆฌ๋ ์๊ณ ๋ฆฌ์ฆ ๊ธฐ๋ณธ ์ ์ฐจ
- ์ ๋ ฌ ๋๋ ๊ธฐ์ค ๊ณ์ฐ (์: ์ข ๋ฃ ์๊ฐ, ๊ฐ์น/๋ฌด๊ฒ ๋น์จ ๋ฑ)
- ํ์ฌ ์ํ์์ ๊ฐ์ฅ ์ข์ ์ ํ์ ํจ
- ์ํ ๊ฐฑ์ (์์ ์ฐจ๊ฐ, ์ ํ ๊ธฐ๋ก ๋ฑ)
- ์ข ๋ฃ ์กฐ๊ฑด๊น์ง ๋ฐ๋ณต
- ๊ฒฐ์ ์ ๋๋๋ฆฌ์ง ์์
3. ๋ํ ๊ทธ๋ฆฌ๋ ๋ฌธ์ & ์์
A. ํ๋ ์ ํ ๋ฌธ์ (Activity Selection)
๋ชฉํ: ์์ยท์ข ๋ฃ ์๊ฐ์ด ์ฃผ์ด์ง ํ๋ ์ค ๊ฒน์น์ง ์๊ฒ ์ต๋ ๊ฐ์ ์ ํ
์๊ณ ๋ฆฌ์ฆ:
- ์ข ๋ฃ ์๊ฐ ๊ธฐ์ค ์ค๋ฆ์ฐจ์ ์ ๋ ฌ
- ์ฒซ ํ๋ ์ ํ ํ, ๋ค์ ํ๋๋ค์ด ์ด์ ํ๋ ์ข ๋ฃ ์๊ฐ ์ดํ ์์ํ๋ฉด ์ ํ
Java ์์:
List<Activity> activitySelection(List<Activity> activities) {
activities.sort(Comparator.comparingInt(a -> a.end));
List<Activity> result = new ArrayList<>();
int lastEnd = -1;
for (Activity act : activities) {
if (act.start >= lastEnd) {
result.add(act);
lastEnd = act.end;
}
}
return result;
}
์ด์ : ์ข ๋ฃ ์๊ฐ์ด ๋น ๋ฅผ์๋ก ์ดํ ํ๋ ์ ํ ๊ฐ๋ฅ์ฑ์ด ๋์์ง
B. ๋์ ๊ฑฐ์ค๋ฆ(ํ์ค ํํ ๋จ์)
๋ชฉํ: ๊ฑฐ์ค๋ฆ๋์ ์ฃผ์ด์ง ํํ ๋จ์(1,5,10,25 ๋ฑ)๋ก ์ต์ ๊ฐ์์ ๋์ ์ผ๋ก ์ง๊ธ
ํ์ด:
- ๋จ์ ๊ธ์ก ์ดํ์ ๊ฐ์ฅ ํฐ ๋จ์ ๋์ ์ ๋ฐ๋ณต์ ์ผ๋ก ์ฌ์ฉ
- ๊ธ์ก์ด 0์ ๋๋ฉด ์ข ๋ฃ
Java ์์:
int minCoins(int[] coins, int amount) {
Arrays.sort(coins);
int count = 0;
for (int i = coins.length - 1; i >= 0; i--) {
while (amount >= coins[i]) {
amount -= coins[i];
count++;
}
}
return count;
}
์ฃผ์:
- ๋ฏธ๊ตญ/ํ๊ตญ์ฒ๋ผ ํ์ค์ ์ธ ํํ ์ฒด๊ณ์์๋ ์ต์
- ๋นํ์ค ์ฝ์ธ ์ธํธ์์๋ ์ต์ ๋ณด์ฅ ์ ๋จ
C. ๋ถํ ๊ฐ๋ฅ ๋ฐฐ๋ญ (Fractional Knapsack)
๋ชฉํ: ์ผ๋ถ๋ง ๋ด์ ์ ์๋(fractional) ๋ฌผ๊ฑด์ ํ์ฉํ์ฌ ๊ฐ์น ์ต๋ํ
์๊ณ ๋ฆฌ์ฆ:
- ๊ฐ ์์ดํ ์ ๊ฐ์น/๋ฌด๊ฒ ๋น์จ ๊ณ์ฐ
- ๋น์จ ๋ด๋ฆผ์ฐจ์ ์ ๋ ฌ
- ๋น์จ์ด ๋์ ๊ฒ๋ถํฐ ๋ด๊ณ , ์ฉ๋ ๋ถ์กฑ ์ ์ผ๋ถ๋ง ๋ด์
Java ์์:
double fractionalKnapsack(Item[] items, int W) {
Arrays.sort(items, (a, b) -> Double.compare(b.value/b.weight, a.value/b.weight));
double total = 0;
for (Item item : items) {
if (W >= item.weight) {
total += item.value;
W -= item.weight;
} else {
total += item.value * ((double) W / item.weight);
break;
}
}
return total;
}
์ด์ :
๊ฐ์น ํจ์จ์ด ๋์ ๋ฌผ๊ฑด๋ถํฐ ๋ด๋ ๊ฒ์ด ์ ์ฒด ์ต์ ํด๋ก ์ด์ด์ง
D. ํํ๋ง ์ฝ๋ฉ (Huffman Coding)
๋ชฉํ: ๋ฐ์ดํฐ ์์ถ์ ์ํ ์ต์ ์ ์ด์ง ํธ๋ฆฌ ๊ตฌ์ฑ
๋ฐฉ๋ฒ:
- ๋น๋์ ๊ธฐ์ค์ผ๋ก ์ต์ ํ(Min-Heap) ๊ตฌ์ฑ
- ๊ฐ์ฅ ์์ ๋ ๋น๋ ๋ ธ๋๋ฅผ ๋ณํฉํ์ฌ ์ ๋ ธ๋ ์์ฑ
- ๋ ธ๋ ํ๋ ๋จ์ ๋๊น์ง ๋ฐ๋ณต
E. ์ต์ ์ ์ฅ ํธ๋ฆฌ(MST) - Kruskal / Prim
- Kruskal: ์ฌ์ดํด์ ๋ง๋ค์ง ์๋ ๊ฐ์ฅ ์งง์ ๊ฐ์ ๋ถํฐ ์ ํ
- Prim: ํ์ฌ ํธ๋ฆฌ์ ์ฐ๊ฒฐ๋๋ ๊ฐ์ฅ ์งง์ ๊ฐ์ ์ ๊ณ์ ์ถ๊ฐ
์ด์ :
๊ตญ์์ ์ผ๋ก ๊ฐ์ฅ ์งง์ ๊ฐ์ ์ ๊ณ ๋ฅด๋, ํญ์ ์ต์ ์ ์ฅ ํธ๋ฆฌ๋ก ์ด์ด์ง
4. ์ฝ๋ฉ ํ ์คํธ์์ ์์ฃผ ๋์ค๋ ๊ทธ๋ฆฌ๋ ์ ํ
- ํ๋ ์ ํ(Interval Scheduling)
- ์ต์ ๋์ ๊ฐ์
- ๋ถํ ๊ฐ๋ฅ ๋ฐฐ๋ญ
- ์์ ์ค์ผ์ค๋ง(Job Sequencing with Deadlines)
- ๋กํ ์ฐ๊ฒฐ ์ต์ ๋น์ฉ
- ์ ํ ๊ฒ์(Jump Game)
- ์ฃผ์ด์ง ์ซ์ ๋ฐฐ์ด๋ก ๊ฐ์ฅ ํฐ ์ ๋ง๋ค๊ธฐ
- ์ฃผ์ ์ ๋ฌธ์ (Gas Station)
- ๋ฌธ๋จ ์ ๋ ฌ(Text Justification)
5. ๊ทธ๋ฆฌ๋ ์ ๋น์ฑ ๊ฒ์ฆ๋ฒ
- ๊ทธ๋ฆฌ๋ ์ ํ ์์ฑ: ๋งค ๋จ๊ณ์ ์ต์ ์ ํ์ด ์ ์ฒด ์ต์ ์ธ๊ฐ?
- ์ต์ ๋ถ๋ถ ๊ตฌ์กฐ: ๋ถ๋ถ ์ต์ ํด๋ฅผ ์กฐํฉํด ์ ์ฒด ์ต์ ํด ์์ฑ ๊ฐ๋ฅ?
- ๊ฐ๋จํ ์๋ก ๊ทธ๋ฆฌ๋ ๊ฒฐ๊ณผ์ ์์ ํ์์ ๊ฒฐ๊ณผ๋ฅผ ๋น๊ตํด๋ณด๊ธฐ
6. ์ฅ์ ๊ณผ ํ๊ณ
| ์ฅ์ | ๋จ์ |
|---|---|
| ์๊ณ ๋ฆฌ์ฆ์ด ๋จ์ํ๊ณ ๋น ๋ฆ (O(n)~O(n log n)) | ๋ชจ๋ ๋ฌธ์ ์ ์ต์ ํด ๋ณด์ฅ X |
| ์์ ํจ์จ์ ์ผ๋ก ์ฌ์ฉ | ๋ง๋ ๋ฌธ์ ์ ํ ํ์ ํ์ |
| ์ค์ผ์ค๋ง, ๊ฒฝ๋ก ํ์, ์์ถ ๋ฑ์ ํ์ฉ | ๊ฒฝ์ฐ์ ๋ฐ๋ผ DP, ์์ ํ์ ํ์ |
7. ์ค์ ํ
- ๋ชฉํ๊ฐ ์ต๋/์ต์์ด๊ณ , ํ์ฌ ์ต์ ์ ํ์ด ์ ์ฒด์๋ ์ข์ ๊ฒ ๊ฐ์ผ๋ฉด ์ผ๋จ ๊ทธ๋ฆฌ๋ ๊ณ ๋ ค
- ์ ๋ ฌ์ ๋๋ถ๋ถ์ ๊ทธ๋ฆฌ๋ ์์์
- ๋ฐ๋์ ๊ทธ๋ฆฌ๋์ ์ ๋น์ฑ์ ์ค๋ช ํ ์ ์์ด์ผ ํจ (์ฆ๋ช or ๋ฐ๋ก ์ ์)
- ํ๋ ์ ํ, ๋ฐฐ๋ญ, ๋์ , MST, ํํ๋ง ๋ฑ์ ๋ํ ํจํด ์์ง
๐ ์์ฝ ํ
| ๋ฌธ์ ์ ํ | ๊ทธ๋ฆฌ๋ ์ ํ ๊ธฐ์ค | ์ด์ /๋น๊ณ |
|---|---|---|
| ํ๋ ์ ํ | ๋น ๋ฅธ ์ข ๋ฃ ์๊ฐ | ์ดํ ํ๋ ๊ธฐํ ๊ทน๋ํ |
| ๋ถํ ๊ฐ๋ฅ ๋ฐฐ๋ญ | ๊ฐ์น/๋ฌด๊ฒ ๋น์จ ์ต๋ | ์ผ๋ถ ์ ํ ๊ฐ๋ฅ ๋ฌธ์ ์ ์ต์ |
| ์ต์ ๋์ ๊ฑฐ์ค๋ฆ | ๊ฐ์ฅ ํฐ ํํ ๋จ์ ์ฐ์ | ํ์ค ํํ ์ฒด๊ณ์์๋ง ํญ์ ์ต์ |
| ์์ ์ค์ผ์ค๋ง | ๋ง๊ฐ ์๊ฐ ๋ด ์ต๋ ์ด์ต | ๋น ๋ฅธ ์ฌ๋กฏ ํ๋ณด |
| MST(Kruskal/Prim) | ์ต์ ๊ฐ์ค์น ๊ฐ์ ์ ํ | ์ฌ์ดํด ๋ฐฉ์ง & ์ ์ฒด ์ต์ |
| ํํ๋ง ์ฝ๋ฉ | ๊ฐ์ฅ ๋ฎ์ ๋น๋ ๋จผ์ ํฉ์นจ | ์ ์ฒด ์ฝ๋ ๊ธธ์ด ์ต์ํ |
์์
๐ข 1. ํ๋ ์ ํ ๋ฌธ์ (Activity Selection)
๋ฌธ์ : ๊ฐ ํ๋์ ์์ยท์ข ๋ฃ ์๊ฐ์ด ์ฃผ์ด์ง ๋, ๊ฒน์น์ง ์๊ฒ ์ต๋ํ ๋ง์ ํ๋์ ์ ํํ์ธ์.
ํ์ด ๋ฐฉ๋ฒ:
- ์ข ๋ฃ ์๊ฐ ๊ธฐ์ค ์ค๋ฆ์ฐจ์ ์ ๋ ฌ
- ์ด์ ์ ์ ํํ ํ๋์ ์ข ๋ฃ ์ดํ์ ์์ํ๋ ํ๋๋ง ์ถ๊ฐ
List<Activity> activitySelection(List<Activity> acts) {
acts.sort(Comparator.comparingInt(a -> a.end));
List<Activity> result = new ArrayList<>();
int lastEnd = -1;
for (Activity act : acts) {
if (act.start >= lastEnd) {
result.add(act);
lastEnd = act.end;
}
}
return result;
}
์ค๋ช : ํญ์ ๊ฐ์ฅ ๋นจ๋ฆฌ ๋๋๋ ํ๋์ ์ ํํด์ผ ์ดํ์ ์ต๋ํ ๋ง์ ํ๋์ ์ถ๊ฐํ ์ ์์ต๋๋ค.
๐ข 2. ๋์ ๊ฑฐ์ค๋ฆ (Coin Change, ํ์ค ํํ ๋จ์)
๋ฌธ์ :
๊ฑฐ์ค๋ฆ๋์ ์ต์ ๋์ ๊ฐ์๋ก ์ง๊ธํ์ธ์. (์: ํํ๋จ์ = {1, 5, 10, 25})
ํ์ด ๋ฐฉ๋ฒ:
- ๋งค๋ฒ ๋จ์ ๊ธ์ก ๋ด ๊ฐ์ฅ ํฐ ๋์ ์ ์ต๋ํ ์ฌ์ฉ
int minCoins(int[] coins, int amount) {
Arrays.sort(coins);
int count = 0;
for (int i = coins.length - 1; i >= 0; i--) {
while (amount >= coins[i]) {
amount -= coins[i];
count++;
}
}
return count;
}
์ฃผ์:
- ํ์ค ๋์ ๋ง ์ฑ๋ฆฝ (๋นํ์ค: 4,3,1 ๋ฑ์ ์ ๋ต์ ๋ณด์ฅX)
๐ข 3. ๋ถํ ๊ฐ๋ฅํ ๋ฐฐ๋ญ ๋ฌธ์ (Fractional Knapsack)
๋ฌธ์ :
๋ฌผ๊ฑด๋ณ ๊ฐ์น์ ๋ฌด๊ฒ๊ฐ ์ฃผ์ด์ง ๋, ๋ฐฐ๋ญ ์ฉ๋ W ์์์ "์ผ๋ถ๋ง ๋ด์ ์ ์๋" ์กฐ๊ฑด์ผ ๋ ์ต๋ ๊ฐ์น๋ฅผ ๊ตฌํ์ธ์.
ํ์ด ๋ฐฉ๋ฒ:
- ๊ฐ ๋ฌผ๊ฑด์ ๊ฐ์น/๋ฌด๊ฒ ๋น์จ์ ๊ตฌํ์ฌ ๋ด๋ฆผ์ฐจ์ ์ ๋ ฌ, ๋น์จ์ด ๋์ ๊ฒ๋ถํฐ ์ต๋ํ ๋ด๊ธฐ
double fractionalKnapsack(Item[] items, int W) {
Arrays.sort(items, (a, b) -> Double.compare(b.value/b.weight, a.value/b.weight));
double total = 0;
for (Item item : items) {
if (W >= item.weight) {
total += item.value;
W -= item.weight;
} else {
total += item.value * ((double) W / item.weight);
break;
}
}
return total;
}
์ค๋ช
:
๊ฐ์น ํจ์จ์ด ๋์ ๋ฌผ๊ฑด๋ถํฐ ์ต๋ํ ๋ด์์ผ ์ ์ฒด ๊ฐ์น๊ฐ ์ต๋๊ฐ ๋ฉ๋๋ค.
๐ข 4. ์์ ์ค์ผ์ค๋ง / ์ต๋ ์ด์ต ๋ฌธ์ (Job Sequencing with Deadlines)
๋ฌธ์ : ์์ ๋ง๋ค ์๋ฃ ๋ง๊ฐ(deadline)๊ณผ ์ด์ต(profit)์ด ์์ ๋, ๋ง๊ฐ ์ ์์ ์ ์ต๋ ์ด์ต ์์ผ๋ก ๋ฐฐ์นํ์ธ์.
ํ์ด:
- ์ด์ต ๊ธฐ์ค ๋ด๋ฆผ์ฐจ์ ์ ๋ ฌ โ ๊ฐ๋ฅํ ๊ฐ์ฅ ๋น ๋ฅธ ๋ง๊ฐ ์ฌ๋กฏ์ ์์ ๋ฐฐ์น
๐ข 5. ํํ๋ง ์ฝ๋ฉ (Huffman Coding)
๋ฌธ์ : ๋ฌธ์ ๋น๋์๊ฐ ์ฃผ์ด์ง ๋ ์ต์ ์ ์ด์ง ์ฝ๋(์์ถ)๋ฅผ ๋ง๋์ธ์.
ํ์ด:
- ๊ฐ์ฅ ์์ ๋ ๋น๋์ ๋ ธ๋๋ฅผ ๋ฐ๋ณต์ ์ผ๋ก ๋ณํฉ(์ต์ ํ)
- ํธ๋ฆฌ ์์ฑ ํ ์ฝ๋ ๊ธธ์ด ์ต์ํ
๐ข 6. ์ต์ ์ ์ฅ ํธ๋ฆฌ(MST, Kruskal/Prim)
๋ฌธ์ : ๊ทธ๋ํ์ ๋ชจ๋ ๋ ธ๋๋ฅผ ์ฐ๊ฒฐํ๋ ๊ฐ์ค์น ์ต์ ํฉ์ ํธ๋ฆฌ(์ฌ์ดํด ์์)๋ฅผ ๋ง๋์ธ์.
- Kruskal: ๊ฐ์ฅ ์์ ๊ฐ์ (์ฌ์ดํด X)๋ถํฐ ์ ํ
- Prim: ํ์ฌ ํธ๋ฆฌ๋ ์ฐ๊ฒฐ๋ ๊ฐ์ฅ ์์ ๊ฐ์ ํ์ฅ
โ ์ ๋ฆฌ & ์ถ์ ํ
| ๋ฌธ์ ์ ํ | ๋ํ ๊ทธ๋ฆฌ๋ ๊ธฐ์ค/์ ๋ต | ์ถ์ ํฌ์ธํธ |
|---|---|---|
| ํ๋ ์ ํ | ์ข ๋ฃ ์๊ฐ ๊ธฐ์ค | ์ต๋ ํ๋ ๊ฐ์ |
| ๋์ ๊ฑฐ์ค๋ฆ | ํฐ ๋จ์๋ถํฐ ์ฌ์ฉ | ์ต์ ๋์ ๊ฐ์ |
| ๋ถํ ๊ฐ๋ฅ ๋ฐฐ๋ญ | ๊ฐ์น/๋ฌด๊ฒ ๋น์จ ์ต๋ | ์ต๋ ๊ฐ์น |
| ์์ ์ค์ผ์ค๋ง | ํฐ ์ด์ต ์ + ๋น ๋ฅธ ๋ง๊ฐ ๋ฐฐ์น | ์ต๋ ์ด์ต |
| ํํ๋ง ์ฝ๋ฉ | ๋น๋ ๋ฎ์ ๊ฒ๋ถํฐ ๋ณํฉ | ์์ถ ํจ์จ ์ต์ |
| MST | ๊ฐ์ฅ ์งง์ ๊ฐ์ ์ ํ, ์ฌ์ดํดX | ์ต์ ๋น์ฉ ํธ๋ฆฌ |
- ์ฝ๋ฉ ํ ์คํธ ๋น์ถ ์์ผ๋ก ์ฐ์ต: ๋์ , ํ๋ ์ ํ, ๋ฐฐ๋ญ, MST, Huffman
- ๋ฐ๋ก/์ต์ ์ํฉ ๋ฐ๋์ ์ฒดํฌ(ํ์ค ํํ/๋ฐฐ๋ญ ์์ ๋ถํ ๋ฑ)
- ์ ๋ ฌ & ๋ฐ๋ณต๋ฌธ โ ์ ํ & ์์ ์ฐจ๊ฐ โ ์ข ๋ฃ ์กฐ๊ฑด ์ฒดํฌ๊ฐ ๊ฐ์ฅ ๊ธฐ๋ณธ ํจํด
references