contents

๐Ÿช™ ์ฝ”๋”ฉ ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•œ ๊ทธ๋ฆฌ๋””(Greedy) ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ฐ€์ด๋“œ

1. ๊ทธ๋ฆฌ๋”” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋ž€?

๊ทธ๋ฆฌ๋”” ์•Œ๊ณ ๋ฆฌ์ฆ˜(Greedy Algorithm) ์€ ์ตœ์ ํ™” ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ๋•Œ ๊ฐ ๋‹จ๊ณ„์—์„œ ๊ทธ ์ˆœ๊ฐ„ ๊ฐ€์žฅ ์ข‹์•„ ๋ณด์ด๋Š” ์„ ํƒ(๊ตญ์†Œ ์ตœ์ , Local Optimal) ์„ ํ•˜๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. ์ด์ „ ๊ฒฐ์ •์„ ๋˜๋Œ๋ฆฌ์ง€ ์•Š๊ณ (๋ฐฑํŠธ๋ž˜ํ‚น ์—†์Œ) ๋งค ๋‹จ๊ณ„ ์„ ํƒ์„ ํ™•์ •ํ•ด ๋‚˜๊ฐ‘๋‹ˆ๋‹ค.


2. ๊ทธ๋ฆฌ๋”” ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ธฐ๋ณธ ์ ˆ์ฐจ

  1. ์ •๋ ฌ ๋˜๋Š” ๊ธฐ์ค€ ๊ณ„์‚ฐ (์˜ˆ: ์ข…๋ฃŒ ์‹œ๊ฐ„, ๊ฐ€์น˜/๋ฌด๊ฒŒ ๋น„์œจ ๋“ฑ)
  2. ํ˜„์žฌ ์ƒํƒœ์—์„œ ๊ฐ€์žฅ ์ข‹์€ ์„ ํƒ์„ ํ•จ
  3. ์ƒํƒœ ๊ฐฑ์‹  (์ž์› ์ฐจ๊ฐ, ์„ ํƒ ๊ธฐ๋ก ๋“ฑ)
  4. ์ข…๋ฃŒ ์กฐ๊ฑด๊นŒ์ง€ ๋ฐ˜๋ณต
  5. ๊ฒฐ์ •์„ ๋˜๋Œ๋ฆฌ์ง€ ์•Š์Œ

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 ๋“ฑ)๋กœ ์ตœ์†Œ ๊ฐœ์ˆ˜์˜ ๋™์ „์œผ๋กœ ์ง€๊ธ‰

ํ’€์ด:

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)

๋ชฉํ‘œ: ๋ฐ์ดํ„ฐ ์••์ถ•์„ ์œ„ํ•œ ์ตœ์ ์˜ ์ด์ง„ ํŠธ๋ฆฌ ๊ตฌ์„ฑ

๋ฐฉ๋ฒ•:


E. ์ตœ์†Œ ์‹ ์žฅ ํŠธ๋ฆฌ(MST) - Kruskal / Prim

์ด์œ :
๊ตญ์†Œ์ ์œผ๋กœ ๊ฐ€์žฅ ์งง์€ ๊ฐ„์„ ์„ ๊ณ ๋ฅด๋˜, ํ•ญ์ƒ ์ตœ์  ์‹ ์žฅ ํŠธ๋ฆฌ๋กœ ์ด์–ด์ง


4. ์ฝ”๋”ฉ ํ…Œ์ŠคํŠธ์—์„œ ์ž์ฃผ ๋‚˜์˜ค๋Š” ๊ทธ๋ฆฌ๋”” ์œ ํ˜•


5. ๊ทธ๋ฆฌ๋”” ์ •๋‹น์„ฑ ๊ฒ€์ฆ๋ฒ•


6. ์žฅ์ ๊ณผ ํ•œ๊ณ„

์žฅ์  ๋‹จ์ 
์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ๋‹จ์ˆœํ•˜๊ณ  ๋น ๋ฆ„ (O(n)~O(n log n)) ๋ชจ๋“  ๋ฌธ์ œ์— ์ตœ์ ํ•ด ๋ณด์žฅ X
์ž์› ํšจ์œจ์ ์œผ๋กœ ์‚ฌ์šฉ ๋งž๋Š” ๋ฌธ์ œ ์œ ํ˜• ํŒŒ์•… ํ•„์ˆ˜
์Šค์ผ€์ค„๋ง, ๊ฒฝ๋กœ ํƒ์ƒ‰, ์••์ถ• ๋“ฑ์— ํ™œ์šฉ ๊ฒฝ์šฐ์— ๋”ฐ๋ผ DP, ์™„์ „ํƒ์ƒ‰ ํ•„์š”

7. ์‹ค์ „ ํŒ


๐Ÿ“Œ ์š”์•ฝ ํ‘œ

๋ฌธ์ œ ์œ ํ˜• ๊ทธ๋ฆฌ๋”” ์„ ํƒ ๊ธฐ์ค€ ์ด์œ /๋น„๊ณ 
ํ™œ๋™ ์„ ํƒ ๋น ๋ฅธ ์ข…๋ฃŒ ์‹œ๊ฐ„ ์ดํ›„ ํ™œ๋™ ๊ธฐํšŒ ๊ทน๋Œ€ํ™”
๋ถ„ํ•  ๊ฐ€๋Šฅ ๋ฐฐ๋‚ญ ๊ฐ€์น˜/๋ฌด๊ฒŒ ๋น„์œจ ์ตœ๋Œ€ ์ผ๋ถ€ ์„ ํƒ ๊ฐ€๋Šฅ ๋ฌธ์ œ์— ์ตœ์ 
์ตœ์†Œ ๋™์ „ ๊ฑฐ์Šค๋ฆ„ ๊ฐ€์žฅ ํฐ ํ™”ํ ๋‹จ์œ„ ์šฐ์„  ํ‘œ์ค€ ํ™”ํ ์ฒด๊ณ„์—์„œ๋งŒ ํ•ญ์ƒ ์ตœ์ 
์ž‘์—… ์Šค์ผ€์ค„๋ง ๋งˆ๊ฐ ์‹œ๊ฐ„ ๋‚ด ์ตœ๋Œ€ ์ด์ต ๋น ๋ฅธ ์Šฌ๋กฏ ํ™•๋ณด
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;
}

์ฃผ์˜:


๐ŸŸข 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)

๋ฌธ์ œ: ๊ทธ๋ž˜ํ”„์˜ ๋ชจ๋“  ๋…ธ๋“œ๋ฅผ ์—ฐ๊ฒฐํ•˜๋Š” ๊ฐ€์ค‘์น˜ ์ตœ์†Œ ํ•ฉ์˜ ํŠธ๋ฆฌ(์‚ฌ์ดํด ์—†์Œ)๋ฅผ ๋งŒ๋“œ์„ธ์š”.


โœ… ์ •๋ฆฌ & ์ถœ์ œ ํŒ

๋ฌธ์ œ ์œ ํ˜• ๋Œ€ํ‘œ ๊ทธ๋ฆฌ๋”” ๊ธฐ์ค€/์ „๋žต ์ถœ์ œ ํฌ์ธํŠธ
ํ™œ๋™ ์„ ํƒ ์ข…๋ฃŒ ์‹œ๊ฐ„ ๊ธฐ์ค€ ์ตœ๋Œ€ ํ™œ๋™ ๊ฐœ์ˆ˜
๋™์ „ ๊ฑฐ์Šค๋ฆ„ ํฐ ๋‹จ์œ„๋ถ€ํ„ฐ ์‚ฌ์šฉ ์ตœ์†Œ ๋™์ „ ๊ฐœ์ˆ˜
๋ถ„ํ•  ๊ฐ€๋Šฅ ๋ฐฐ๋‚ญ ๊ฐ€์น˜/๋ฌด๊ฒŒ ๋น„์œจ ์ตœ๋Œ€ ์ตœ๋Œ€ ๊ฐ€์น˜
์ž‘์—… ์Šค์ผ€์ค„๋ง ํฐ ์ด์ต ์ˆœ + ๋น ๋ฅธ ๋งˆ๊ฐ ๋ฐฐ์น˜ ์ตœ๋Œ€ ์ด์ต
ํ—ˆํ”„๋งŒ ์ฝ”๋”ฉ ๋นˆ๋„ ๋‚ฎ์€ ๊ฒƒ๋ถ€ํ„ฐ ๋ณ‘ํ•ฉ ์••์ถ• ํšจ์œจ ์ตœ์ 
MST ๊ฐ€์žฅ ์งง์€ ๊ฐ„์„  ์„ ํƒ, ์‚ฌ์ดํดX ์ตœ์†Œ ๋น„์šฉ ํŠธ๋ฆฌ

references