Greedy

1. Greedy Algorithm ์ด๋ž€?

Greedy Algorithm(ํƒ์š• ์•Œ๊ณ ๋ฆฌ์ฆ˜) ์€ "ํ˜„์žฌ ์ƒํ™ฉ์—์„œ ๊ฐ€์žฅ ์ข‹์•„๋ณด์ด๋Š”(์ตœ์ ์˜) ์„ ํƒ์„ ๋ฐ˜๋ณตํ•ด์„œ ์ „์ฒด ์ตœ์  ํ•ด์— ๋„๋‹ฌํ•˜๋ ค๋Š” ์ „๋žต" ์ž„.

  • ๋งค ๋‹จ๊ณ„์—์„œ ๋กœ์ปฌ ์ตœ์ (local optimum) ์„ ์„ ํƒํ•˜์ง€๋งŒ, ์ด ์„ ํƒ์ด ์ „์ฒด์ ์œผ๋กœ๋„ ๊ธ€๋กœ๋ฒŒ ์ตœ์ (global optimum) ์ด ๋  ์ˆ˜ ์žˆ์–ด์•ผ ํ•จ.

  • ๋ณดํ†ต ๊ทธ๋ฆฌ๋””๋Š” DP ๋ณด๋‹ค ๋น ๋ฅด๊ณ  ๊ฐ„๋‹จํ•˜์ง€๋งŒ, ํ•ญ์ƒ ์ •๋‹ต์„ ๋ณด์žฅํ•˜์ง€๋Š” ์•Š์Œ


2. Greedy ๊ฐ€ ์ž˜ ์ž‘๋™ํ•˜๋Š” ์กฐ๊ฑด

1. ํƒ์š•์  ์„ ํƒ ์†์„ฑ(Greedy Choice Property)

  • ์•ž์˜ ์„ ํƒ์ด ์ดํ›„์˜ ์„ ํƒ์— ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š์•„์•ผ ํ•จ

  • ์ฆ‰, "์ง€๊ธˆ ์ด ์ˆœ๊ฐ„ ๊ฐ€์žฅ ์ข‹์€ ์„ ํƒ์„ ํ•˜๋ฉด, ์ „์ฒต์ ์œผ๋กœ ์ตœ์ ์ด๋‹ค" ๋Š” ๊ฒƒ์„ ์ฆ๋ช…ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•จ.

2. ์ตœ์  ๋ถ€๋ถ„ ๊ตฌ์กฐ(Optimal Substructure)

  • DP ์™€ ๋™์ผ. ๋ฌธ์ œ์˜ ์ „์ฒด ์ตœ์  ํ•ด๊ฐ€ ํ•˜์œ„ ๋ฌธ์ œ๋“ค์˜ ์ตœ์  ํ•ด๋กœ ๊ตฌ์„ฑ๋˜์–ด์•ผ ํ•จ.

์ด ๋‘ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š” ๋ฌธ์ œ๋งŒ ๊ทธ๋ฆฌ๋””๋กœ ํ’€ ์ˆ˜ ์žˆ์Œ

๋งŒ์กฑํ•˜์ง€ ์•Š์œผ๋ฉด DP ๋‚˜ ์™„์ „ํƒ์ƒ‰(Brute Force) ์„ ์จ์•ผํ•จ.


3. ๋Œ€ํ‘œ์ ์ธ Greedy ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์˜ˆ์‹œ

๋ฌธ์ œ
ํ•ต์‹ฌ ์•„์ด๋””์–ด

๋™์ „ ๊ฑฐ์Šค๋ฆ„๋ˆ

ํฐ ๋‹จ์œ„ ๋™์ „๋ถ€ํ„ฐ ์ตœ๋Œ€ํ•œ ์‚ฌ์šฉ

ํšŒ์˜์‹ค ๋ฐฐ์ •

์ข…๋ฃŒ ์‹œ๊ฐ„์ด ๊ฐ€์žฅ ๋น ๋ฅธ ํšŒ์˜๋ถ€ํ„ฐ ์„ ํƒ

๋ฐฐ๋‚ญ ๋ฌธ์ œ(๋ถ„ํ•  ํ—ˆ์šฉ ์‹œ)

๋ฌด๊ฒŒ ๋Œ€๋น„ ๊ฐ€์น˜๊ฐ€ ๋†’์€ ๋ฌผ๊ฑด๋ถ€ํ„ฐ ์„ ํƒ

์ตœ์†Œ ์ŠคํŒจ๋‹ ํŠธ๋ฆฌ

Kruskal, Prim ์•Œ๊ณ ๋ฆฌ์ฆ˜

Huffman Coding

๋นˆ๋„ ๋‚ฎ์€ ๋ฌธ์ž๋ถ€ํ„ฐ ๋ณ‘ํ•ฉ

ํ™œ๋™ ์„ ํƒ ๋ฌธ์ œ

ํ™œ๋™ ์ข…๋ฃŒ ์‹œ๊ฐ„์ด ๋น ๋ฅธ ์ˆœ์œผ๋กœ ์„ ํƒ


4. ์˜ˆ์ œ : ๋™์ „ ๊ฑฐ์Šค๋ฆ„๋ˆ ๋ฌธ์ œ

๋ฌธ์ œ

  • ๊ฑฐ์Šค๋ฆ„๋ˆ์„ ์ค„ ๋–„ ๋™์ „ ๊ฐœ์ˆ˜๊ฐ€ ์ตœ์†Œ๊ฐ€ ๋˜๋„๋ก ์ฃผ๋Š” ๋ฐฉ๋ฒ•์„ ๊ตฌํ•˜์‹œ์˜ค.

  • ๋™์ „ ๋‹จ์œ„ : 500์›, 100์›, 50์›, 10์›

  • ์˜ˆ : 1260์›์„ ๊ฑฐ์Šฌ๋Ÿฌ ์ค˜์•ผ ํ•œ๋‹ค๋ฉด?

ํ’€์ด

  • ๊ฐ€์žฅ ํฐ ๋‹จ์œ„๋ถ€ํ„ฐ ์ตœ๋Œ€ํ•œ ์‚ฌ์šฉ โ‡’ ๊ทธ๊ฒŒ ํ˜„์žฌ ์ตœ์„ ์˜ ์„ ํƒ

  • 500์›๋ถ€ํ„ฐ ๋‚˜๋ˆ„์–ด๊ฐ€๋ฉฐ ๋ชซ๊ณผ ๋‚˜๋จธ์ง€๋ฅผ ๊ตฌํ•จ.

int[] coins = {500, 100, 50, 10};
int n = 1260;
int count = 0;

for(int coin : coins) {
    count += n / coin; // ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ตœ๋Œ€ ๊ฐœ์ˆ˜
    n %= coin; // ๋‚จ์€ ๊ธˆ์•ก
}
System.out.println(count); // result : 6
  • 500 * 2 + 100 * 2 + 50 * 1 + 10 * 1 = 1260 โ‡’ ์ด 6๊ฐœ

์œ„ ๋ฌธ์ œ๋Š” ๊ทธ๋ฆฌ๋””๊ฐ€ ํ•ญ์ƒ ์ตœ์ ์ธ ์ด์œ : ๋™์ „ ๋‹จ์œ„๊ฐ€ "๋ฐฐ์ˆ˜ ๊ด€๊ณ„" ๋กœ ๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ.


5. Greedy vs DP

ํ•ญ๋ชฉ
๊ทธ๋ฆฌ๋””
DP

์ „๋žต

ํ˜„์žฌ ์ตœ์  ์„ ํƒ

๋ชจ๋“  ๊ฒฝ์šฐ ๊ณ ๋ ค

์‹œ๊ฐ„๋ณต์žก๋„

๋ณดํ†ต ๋” ๋น ๋ฆ„ (O(N log N))

๋ณดํ†ต ๋А๋ฆผ (O(Nยฒ), O(NM) ๋“ฑ)

์กฐ๊ฑด

ํƒ์š•์  ์„ ํƒ ์†์„ฑ, ์ตœ์  ๋ถ€๋ถ„ ๊ตฌ์กฐ

์ค‘๋ณต ๋ถ€๋ถ„ ๋ฌธ์ œ, ์ตœ์  ๋ถ€๋ถ„ ๊ตฌ์กฐ

๊ตฌํ˜„

๊ฐ„๋‹จํ•œ ํŽธ

๋ณต์žกํ•˜๊ณ  ๋ฉ”๋ชจ๋ฆฌ๋„ ํ•„์š”

์ •๋‹ต ๋ณด์žฅ

์กฐ๊ฑด ๋งŒ์กฑ ์‹œ๋งŒ ๋ณด์žฅ

ํ•ญ์ƒ ๋ณด์žฅ๋จ


6. ์‹ค์ „์—์„œ Greedy ์ ์šฉ ํŒ

  1. ์ •๋ ฌ์ด ๊ฑฐ์˜ ํ•„์ˆ˜ - ์–ด๋–ค ๊ธฐ์ค€์œผ๋กœ ์ •๋ ฌ ํ›„ ์ˆœ์ฐจ์ ์œผ๋กœ ์ฒ˜๋ฆฌ

  2. "ํ˜„์žฌ ์ˆœ๊ฐ„ ์ตœ์ " ์ด ์ „์ฒด ์ตœ์ ์ด ๋˜๋Š”์ง€ ์ง๊ด€ + ์ˆ˜ํ•™์ ์œผ๋กœ ๊ฒ€์ฆ

  3. ๊ทธ๋ฆฌ๋””๋กœ ํ’€๋ ธ๋‹ค๊ณ  ํ™•์‹ ์ด ์•ˆ ๋˜๋ฉด, ๋ฐ˜๋ก€ ํ…Œ์ŠคํŠธ ํ•ด๋ณด์ž

  4. ๊ทธ๋ฆฌ๋””๊ฐ€ ์•ˆ ๋จนํžŒ๋‹ค ์‹ถ์œผ๋ฉด DP/์™„์ „ํƒ์ƒ‰์œผ๋กœ ๋ฐฉํ–ฅ ์ „ํ™˜

Last updated

Was this helpful?