ํ์์ ์๊ณ ๋ฆฌ์ฆ(Greedy Algorithm)์ด๋?
ํ์์ ์๊ณ ๋ฆฌ์ฆ์ ๊ฐ ๋จ๊ณ์์ ๊ฐ์ฅ ์ต์ ์ ์ ํ์ ํ๋ ๋ฐฉ์์ผ๋ก ์ต์ ํด๋ฅผ ์ฐพ๋ ๋ฐฉ๋ฒ ์ด๋ค. ์ ์ฒด ์ต์ ํด๋ฅผ ๊ณ ๋ คํ์ง ์๊ณ , ๋งค ์๊ฐ ์ต์ ์ ์ ํ์ ํ๊ธฐ ๋๋ฌธ์ ๊ตฌํ์ด ๊ฐ๋จํ์ง๋ง, ํญ์ ์ต์ ํด๋ฅผ ๋ณด์ฅํ๋ ๊ฒ์ ์๋๋ค.
ํ์์ ์๊ณ ๋ฆฌ์ฆ์ด ์ ์ฉ๋ ์ ์๋ ๋ํ์ ์ธ ๋ฌธ์ ๋ค:
- ๋์ ๊ฑฐ์ค๋ฆ๋ ๋ฌธ์ (Coin Change Problem)
- ํ์์ค ๋ฐฐ์ ๋ฌธ์ (Activity Selection Problem)
- ๋ฐฐ๋ญ ๋ฌธ์ (Knapsack Problem)
- ์์ ์ค์ผ์ค๋ง ๋ฌธ์ (Activity Selection)
- ์ต์ ์ ์ฅ ํธ๋ฆฌ (MST, Minimum Spanning Tree)
- ํํ๋ง ์ฝ๋ฉ (Huffman Coding)
ํ์ ์๊ณ ๋ฆฌ์ฆ์ ํน์ง
- ๋น ๋ฅธ ์คํ ์๊ฐ: O(n log n) ๋๋ O(n)๋ก ํด๊ฒฐ ๊ฐ๋ฅ
- ๊ตญ์์ ์ต์ ํด ๊ธฐ๋ฐ: ํ์ฌ ์ํ์์ ๊ฐ์ฅ ์ข์ ์ ํ์ ํ๋ค.
- ์ต์ ํด๋ฅผ ํญ์ ๋ณด์ฅํ์ง ์์: ๋์ ๊ฑฐ์ค๋ฆ๋ ๋ฌธ์ ์ฒ๋ผ ์ผ๋ถ ๊ฒฝ์ฐ์๋ ์ต์ ํด๋ฅผ ๊ตฌํ ์ ์๋ค.
4. ํ์์ ์๊ณ ๋ฆฌ์ฆ์ ํ๊ณ
ํ์์ ์๊ณ ๋ฆฌ์ฆ์ ๋งค ์๊ฐ ์ต์ ์ ์ ํ์ ํ์ง๋ง, ํญ์ ์ ์ฒด ์ต์ ํด๋ฅผ ๋ณด์ฅํ๋ ๊ฒ์ ์๋๋ค. ๋ฐ๋ผ์ ๋ค์๊ณผ ๊ฐ์ ๊ฒฝ์ฐ์๋ ์ฌ์ฉํ๊ธฐ ์ด๋ ต๋ค:
- ์ต์ ๋ถ๋ถ ๊ตฌ์กฐ(Otimal Substructure) ๊ฐ ์๋ ๊ฒฝ์ฐ (์: ๋ฐฐ๋ญ ๋ฌธ์ , ์ผ๋ถ ๋์ ๊ฑฐ์ค๋ฆ๋ ๋ฌธ์ )
- ๊ฒฐ์ ํด์ผ ํ ์์๋ค์ด ์๋ก ์ํฅ์ ๋ฏธ์น๋ ๊ฒฝ์ฐ
์ด๋ฌํ ๋ฌธ์ ์์๋ ๋์ ํ๋ก๊ทธ๋๋ฐ(DP)์ด๋ ๋ฐฑํธ๋ํน(Backtracking) ๊ฐ์ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ด ํ์ํ ์ ์๋ค.
1. O(n) ์๊ฐ ๋ณต์ก๋์ ๊ฑฐ์ค๋ฆ๋ ๋ฌธ์ ํด๊ฒฐ
๊ฑฐ์ค๋ฆ๋ ๋ฌธ์ ๋ ์ฃผ์ด์ง ๋์ ๋ค๋ก ํน์ ๊ธ์ก์ ์ต์ ๊ฐ์์ ๋์ ์ผ๋ก ๋ง๋๋ ๋ฌธ์ ์ด๋ค. ํ์์ ์๊ณ ๋ฆฌ์ฆ์ ๊ฐ์ฅ ํฐ ๋์ ๋ถํฐ ์ ํํ๋ ๋ฐฉ์์ผ๋ก ํด๊ฒฐํ ์ ์๋ค.
JavaScript ์ฝ๋:
function coinChange(coins, amount) {
coins.sort((a, b) => b - a); // ๋ด๋ฆผ์ฐจ์ ์ ๋ ฌ
let count = 0;
for (let coin of coins) {
while (amount >= coin) {
amount -= coin;
count++;
}
}
return amount === 0 ? count : -1;
}
์๊ฐ ๋ณต์ก๋: O(n) (๋์ ๊ฐ์๋งํผ ๋ฐ๋ณต)
์ฃผ์: ์ด ๋ฐฉ๋ฒ์ ํญ์ ์ต์ ํด๋ฅผ ๋ณด์ฅํ์ง ์๋๋ค. ์๋ฅผ ๋ค์ด, ๋์ ์ด [1, 3, 4]์ด๊ณ amount = 6์ผ ๋, ํ์์ ์ ๊ทผ๋ฒ์ [4, 1, 1]์ ์ ํํ์ง๋ง, ์ต์ ํด๋ [3, 3]์ด๋ค.
2. O(n log n) ์๊ฐ ๋ณต์ก๋์ ํ์์ค ๋ฐฐ์ ๋ฌธ์
ํ์์ค ๋ฐฐ์ ๋ฌธ์ ๋ ๊ฐ๋ฅํ ํ ๋ง์ ํ์๋ฅผ ์์ฉํ๊ธฐ ์ํด, ํ์๊ฐ ๊ฒน์น์ง ์๋๋ก ๋ฐฐ์ ํ๋ ๋ฌธ์ ์ด๋ค. ์ข ๋ฃ ์๊ฐ์ด ๊ฐ์ฅ ๋น ๋ฅธ ํ์๋ถํฐ ์ ํํ๋ฉด ์ต์ ํด๋ฅผ ๋ณด์ฅํ ์ ์๋ค.
JavaScript ์ฝ๋:
function maxMeetings(start, end) {
let n = start.length;
let meetings = [];
for (let i = 0; i < n; i++) {
meetings.push([start[i], end[i]]);
}
meetings.sort((a, b) => a[1] - b[1]); // ์ข
๋ฃ ์๊ฐ ๊ธฐ์ค ์ ๋ ฌ
let count = 0, lastEnd = 0;
for (let [s, e] of meetings) {
if (s >= lastEnd) {
count++;
lastEnd = e;
}
}
return count;
}
์๊ฐ ๋ณต์ก๋: O(n log n) (์ ๋ ฌ ํ ์ ํ ํ์)
3. O(E log V) ์๊ฐ ๋ณต์ก๋์ ๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ
๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ(Dijkstra’s Algorithm)์ ๊ฐ์ค์น๊ฐ ์๋ ๊ทธ๋ํ์์ ์ถ๋ฐ์ ์ผ๋ก๋ถํฐ ๋ชจ๋ ์ ์ ๊น์ง์ ์ต๋จ ๊ฒฝ๋ก๋ฅผ ์ฐพ๋ ์๊ณ ๋ฆฌ์ฆ ์ด๋ค. ํ์์ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ์ฌ ๋งค ๋จ๊ณ์์ ์ต๋จ ๊ฑฐ๋ฆฌ๋ฅผ ์ ํํ๋ค.
JavaScript ์ฝ๋:
class PriorityQueue {
constructor() {
this.queue = [];
}
enqueue(value, priority) {
this.queue.push({ value, priority });
this.queue.sort((a, b) => a.priority - b.priority);
}
dequeue() {
return this.queue.shift().value;
}
isEmpty() {
return this.queue.length === 0;
}
}
function dijkstra(graph, start) {
let distances = {};
let pq = new PriorityQueue();
for (let node in graph) {
distances[node] = Infinity;
}
distances[start] = 0;
pq.enqueue(start, 0);
while (!pq.isEmpty()) {
let current = pq.dequeue();
for (let neighbor in graph[current]) {
let newDist = distances[current] + graph[current][neighbor];
if (newDist < distances[neighbor]) {
distances[neighbor] = newDist;
pq.enqueue(neighbor, newDist);
}
}
}
return distances;
}
์๊ฐ ๋ณต์ก๋: O(E log V) (์ฐ์ ์์ ํ๋ฅผ ์ด์ฉํ ๊ตฌํ)
4. ์นด๋ ๋ฌธ์ (Canoeist Problem)
๋ฌธ์
๋ฌด๊ฒ๊ฐ ๋ค๋ฅธ n๋ช ์ ์นด๋ ์ ์๊ฐ ์๊ณ , ๊ฐ ์นด๋์๋ ์ต๋ ๋ ๋ช ๊น์ง ํ ์ ์๋ค. ๋ชจ๋ ์ ์๋ฅผ ์ต์ํ์ ์นด๋์ ๋ฐฐ์นํ๋ ๊ฒ์ด ๋ชฉํ์ด๋ค.
์ ๊ทผ ๋ฐฉ๋ฒ
- ๊ฐ์ฅ ๋ฌด๊ฑฐ์ด ์ ์(heavy)๋ฅผ ์ฐพ๊ณ , ํจ๊ป ํ ์ ์๋ ๊ฐ์ฅ ๋ฌด๊ฑฐ์ด ๊ฐ๋ฒผ์ด ์ ์(light)๋ฅผ ์ฐพ๋๋ค.
- ๋ฌด๊ฑฐ์ด ์ ์์ ๊ฐ๋ฒผ์ด ์ ์๋ฅผ ํจ๊ป ํ์ด๋ค.
- ์ ๊ณผ์ ์ด ๋ถ๊ฐ๋ฅํ๋ฉด ๋ฌด๊ฑฐ์ด ์ ์๋ง ๋ฐ๋ก ํ์ด๋ค.
JavaScript ์ฝ๋ (ํ์ ์๊ณ ๋ฆฌ์ฆ)
function greedyCanoeist(weights, maxWeight) {
weights.sort((a, b) => a - b); // ๋ฌด๊ฒ ๊ธฐ์ค ์ ๋ ฌ
let canoes = 0;
let i = 0, j = weights.length - 1;
while (i <= j) {
if (weights[i] + weights[j] <= maxWeight) {
i++; // ๊ฐ๋ฒผ์ด ์ฌ๋๊ณผ ํจ๊ป ํ์ด๋ค.
} j--; // ๋ฌด๊ฑฐ์ด ์ฌ๋์ ๋ฌด์กฐ๊ฑด ํ์
canoes++;
}
return canoes;
}
์๊ฐ ๋ณต์ก๋: O(n log n) (์ ๋ ฌ) + O(n) (ํ์) = O(n log n)
5. ํ์ ์๊ณ ๋ฆฌ์ฆ์ ์ฆ๋ช (Greedy Algorithm Proof)
ํ์ ์๊ณ ๋ฆฌ์ฆ์ด ํญ์ ์ต์ ํด๋ฅผ ๋ณด์ฅํ๋ ค๋ฉด, ์ ํํ ๊ฒฐ์ ์ด ์ ์ฒด ๋ฌธ์ ์์๋ ์ต์ ํด๋ฅผ ๋ณด์ฅํด์ผ ํ๋ค. ์ด๋ฅผ ์ํ์ ๊ท๋ฉ๋ฒ์ผ๋ก ์ฆ๋ช ํ ์ ์๋ค.
- ์ฒซ ๋ฒ์งธ ์ ํ์ด ์ต์ ํด์ ์ผ๋ถ๋ผ๋ฉด, ๋๋จธ์ง ๋ฌธ์ ๋ ์ต์ ํด๋ฅผ ํฌํจํ ์ ์์ด์ผ ํ๋ค.
- ๊ธฐ์กด์ ์ต์ ํด์์ ์ฒซ ๋ฒ์งธ ์ ํ์ ๋ค๋ฅธ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ด๋ ๋์ผํ ์ฑ๋ฅ์ ์ ์งํ ์ ์์ด์ผ ํ๋ค.
- ๋ง์ฝ ๋ฐ๊ฟจ์ ๋ ๋ ๋์ ํด๋ต์ด ๋์จ๋ค๋ฉด, ํ์์ ์ ํ์ด ์๋ชป๋์์์ ์๋ฏธํ๋ค.
์ ์ฆ๋ช ์ด ์ฑ๋ฆฝํ๋ฉด ํ์ ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํด๋ ์ต์ ํด๋ฅผ ๋ณด์ฅํ ์ ์๋ค.
๋๊ธ