3.6 Greedy Algorithms

2024. 2. 2. 18:27ใ†CS - Roadmap.sh/3. Common Algorithms

CS - 3. Common Algorithms - 3.6 Greedy Algorithms

 

Greedy Algorithms

๐Ÿ’กGreedy algorithms are a type of algorithm that always makes the choice that seems to be the best at that moment. This means that it makes a locally-optimal choice in the hope that this choice will lead to a globally-optimal solution.

์š•์‹ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ํ•ญ์ƒ ๊ทธ ์ˆœ๊ฐ„์— ์ตœ์„ ์ธ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด๋Š” ์„ ํƒ์„ ํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ํ•œ ์œ ํ˜•์ž…๋‹ˆ๋‹ค. ์ฆ‰, ์ด ์„ ํƒ์ด ์ „ ์„ธ๊ณ„์ ์œผ๋กœ ์ตœ์ ์˜ ์†”๋ฃจ์…˜์œผ๋กœ ์ด์–ด์ง€๊ธฐ๋ฅผ ๋ฐ”๋ผ๋ฉฐ ๊ตญ์ง€์ ์œผ๋กœ ์ตœ์ ์˜ ์„ ํƒ์„ ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

 

์ฝ”ํ…Œ, ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ณต๋ถ€ ํ•˜๋ฉด ๊ฐ€์žฅ ์œ ๋ช…ํ•œ ๊ทธ๋ฆฌ๋”” ์•Œ๊ณ ๋ฆฌ์ฆ˜, ์š•์‹ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ž…๋‹ˆ๋‹ค.

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

์ด๋Ÿฌํ•œ ์„ ํƒ์€ ๊ฐ ๋‹จ๊ณ„์—์„œ ์ดํ›„์˜ ์„ ํƒ์— ์˜ํ–ฅ์„ ๋ฏธ์น˜๋ฉฐ, ์„ ํƒ์ด ์ด๋ฃจ์–ด์ง€๋ฉด ์ทจ์†Œํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๋”” ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ํ•ต์‹ฌ์€ "ํ˜„์žฌ์˜ ์„ ํƒ์ด ์ดํ›„์˜ ์„ ํƒ๊ณผ๋Š” ๋…๋ฆฝ์ ์ด๋ฉฐ, ํ˜„์žฌ์˜ ์„ ํƒ์ด ์ตœ์ข… ๊ฒฐ๊ณผ์— ์˜ํ–ฅ์„ ๋ฏธ์นœ๋‹ค"๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. 

๊ทธ๋ฆฌ๋”” ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ํ•ญ์ƒ ์ตœ์ ์˜ ํ•ด๋ฅผ ์ฐพ์•„์ฃผ๋Š” ๊ฒƒ์€ ์•„๋‹ˆ์ง€๋งŒ, ํŠน์ • ๋ฌธ์ œ์—์„œ๋Š” ํšจ๊ณผ์ ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ๊ฑฐ์Šค๋ฆ„๋ˆ ๋ฌธ์ œ๋ฅผ ๊ทธ๋ฆฌ๋”” ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ ํ’€ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 

๊ฐ€์žฅ ํฐ ๋‹จ์œ„์˜ ๋™์ „๋ถ€ํ„ฐ ์ตœ๋Œ€ํ•œ ์‚ฌ์šฉํ•˜์—ฌ ๊ฑฐ์Šค๋ฆ„๋ˆ์„ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ์ตœ์ ์˜ ํ•ด๋ฅผ ์ฐพ๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

In Python

 

๋ฐฉ๊ธˆ ์œ„์˜ ๊ฑฐ์Šค๋ฆ„๋ˆ ๋ฌธ์ œ๋ฅผ ํ’€์–ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

 

์‚ฌ์šฉํ•œ ๋ชจ๋“  ๋™์ „์˜ ๊ฐฏ์ˆ˜๊ฐ€ ์ตœ์†Œ๊ฐ€ ๋˜๋„๋ก ์›ํ•œ๋‹ค๋Š” ๊ฐ€์ •ํ•˜์—, (์ด ๊ฐ€์ •์ด ์ฐจํ›„์„ค๋ช…์— ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.)

def change(c):
    coins = [500, 100, 50, 10] # ๋™์ „์˜ ์ข…๋ฅ˜
    count = {500: 0, 100: 0, 50: 0, 10: 0}
    for coin in coins:
        num = c // coin
        count[coin] = num
        c %= coin
    return count

 

๊ฐ€์žฅํฐ 500์›์œผ๋กœ // ๋”์ด์ƒ ๋‚˜๋ˆ ์ง€์ง€ ์•Š์„๋–„๊นŒ์ง€ ๋‚˜๋ˆˆ๋’ค, ๋‚˜๋จธ์ง€๋ฅผ ๋‹ค์‹œ ๋‹ค์Œ 100์›์œผ๋กœ ๋‚˜๋ˆ„๊ณ .. ์ด๋Ÿฐ ๋…ผ๋ฆฌ๋กœ ๋ฐ˜๋ณตํ•ฉ๋‹ˆ๋‹ค.

์ด๋Ÿฐ๊ฒฝ์šฐ๋Š” ๋„ˆ๋ฌด๋‚˜๋„ ๊น”๋”ํ•œ ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค.

 

๊ทธ๋ฆฌ๋”” ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ํ•ญ์ƒ ์ตœ์ ์˜ ํ•ด๋ฅผ ๋ณด์žฅํ•˜์ง€๋Š” ์•Š๋Š”๋‹ค.

 

๊ทธ๋Ÿฐ๋ฐ ์•ž์—์„œ '๊ทธ๋ฆฌ๋”” ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ํ•ญ์ƒ ์ตœ์ ์˜ ํ•ด๋ฅผ ๋ณด์žฅํ•˜์ง€๋Š” ์•Š๋Š”๋‹ค.' ๋ผ๊ณ  ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

def change(c):
    coins = [10, 7, 1] # ๋™์ „์˜ ์ข…๋ฅ˜
    count = {10: 0, 7: 0, 1: 0}
    for coin in coins:
        num = c // coin
        count[coin] = num
        c %= coin
    return count

์˜ˆ๋ฅผ๋“ค์–ด 14๋ฅผ 10, 7, 1 ๋™์ „์œผ๋กœ ๋‚˜๋ˆˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ด ๋ด…์‹œ๋‹ค.

 

 

์•ž์—์„œ ์š”๊ตฌํ–ˆ๋˜ ๋‹ต์€ ์‚ฌ์šฉํ•œ ๋ชจ๋“  ๋™์ „์˜ ๊ฐœ์ˆ˜๊ฐ€ ์ตœ์†Œ๊ฐ€ ๋˜๋„๋ก ์ž…๋‹ˆ๋‹ค.

(๋ฌผ๋ก  ์ฝ”๋“œ๋ฅผ ๋ฐ”๊พธ๋ฉด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.)

๊ทธ๋ฆฌ๋”” ์•Œ๊ณ ๋ฆฌ์ฆ˜์— ๋”ฐ๋ฅด๋ฉด

14์›์„ 10์› 1๊ฐœ๋กœ ๋‚˜๋ˆˆ ๋’ค 4์›์€ 7์›๋™์ „์œผ๋กœ ๋‚˜๋ˆŒ์ˆ˜ ์—†์œผ๋‹ˆ 1์› ๋™์ „ 4๊ฐœ๋กœ ์ฒ˜๋ฆฌํ•˜์˜€์Šต๋‹ˆ๋‹ค.

 

ํ•˜์ง€๋งŒ, 7์› 2๊ฐœ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ๊ฐ€์žฅ ์ตœ์†Œ์˜ ๋™์ „๊ฐœ์ˆ˜ 2๊ฐœ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

์™œ?

๊ทธ๋ฆฌ๋”” ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ํ•ญ์ƒ ์ตœ์ ์˜ ํ•ด๋ฅผ ๋ณด์žฅํ•˜์ง€ ์•Š์ง€๋งŒ ์™œ? ์‚ฌ์šฉํ• ๊นŒ์š”?

 

ํฌ๊ฒŒ 3๊ฐ€์ง€ ์ด์œ ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

 

1.๊ณ„์‚ฐ ์†๋„

๊ทธ๋ฆฌ๋”” ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๊ฐ ๋‹จ๊ณ„์—์„œ ์ตœ์ ์˜ ์„ ํƒ์„ ํ•˜๋ฏ€๋กœ, ๋‹ค๋ฅธ ์•Œ๊ณ ๋ฆฌ์ฆ˜์— ๋น„ํ•ด ๊ณ„์‚ฐ ์†๋„๊ฐ€ ๋น ๋ฆ…๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ๋ฌธ์ œ์˜ ํฌ๊ธฐ๊ฐ€ ํฌ๊ฑฐ๋‚˜, ๊ณ„์‚ฐ ์‹œ๊ฐ„์ด ์ œํ•œ๋œ ์ƒํ™ฉ์—์„œ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

 

2.๊ฐ„๊ฒฐํ•จ

๊ทธ๋ฆฌ๋”” ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๊ฐ ๋‹จ๊ณ„์—์„œ์˜ ์ตœ์ ์˜ ์„ ํƒ๋งŒ์„ ๊ณ ๋ คํ•˜๋ฏ€๋กœ, ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์„ค๊ณ„์™€ ๊ตฌํ˜„์ด ๋น„๊ต์  ๊ฐ„๊ฒฐํ•ฉ๋‹ˆ๋‹ค.

 

3.ํŠน์ • ๋ฌธ์ œ์— ๋Œ€ํ•œ ์ตœ์ ํ•ด

๊ทธ๋ฆฌ๋”” ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ํŠน์ • ๋ฌธ์ œ์— ๋Œ€ํ•ด ์ตœ์ ์˜ ํ•ด๋ฅผ ๋ณด์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ๊ฑฐ์Šค๋ฆ„๋ˆ ๋ฌธ์ œ, ์ตœ์†Œ ์‹ ์žฅ ํŠธ๋ฆฌ ๋ฌธ์ œ, ์ž‘์—… ์Šค์ผ€์ค„๋ง ๋ฌธ์ œ ๋“ฑ์—์„œ ๊ทธ๋ฆฌ๋”” ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ์ตœ์ ์˜ ํ•ด๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๋ฆฌ๋”” ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ ์šฉํ•˜๊ธฐ ์ „์—, ๊ทธ๋ฆฌ๋”” ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•ด๋„ ์ตœ์ ์˜ ํ•ด๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ์ธ์ง€ ํŒ๋‹จํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๋”” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ํ•ญ์ƒ ์ตœ์ ์˜ ํ•ด๋ฅผ ๋ณด์žฅํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์—, ๋ฌธ์ œ์˜ ํŠน์„ฑ๊ณผ ๊ทธ๋ฆฌ๋”” ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์ ์šฉ ๊ฐ€๋Šฅ์„ฑ์„ ๊ณ ๋ คํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

 

3๋ฒˆ์ด ์œ„์— ๋งํ•œ ์˜ˆ์‹œ์ธ ๊ฑฐ์Šค๋ฆ„๋ˆ ๋ฌธ์ œ์™€ ๋ชจ์ˆœ๋œ๋‹ค๊ณ  ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ ์ €๋Š” ์‚ฌ์šฉํ•œ ๋ชจ๋“  ๋™์ „์˜ ๊ฐฏ์ˆ˜๊ฐ€ ์ตœ์†Œ๊ฐ€ ๋˜๋„๋ก ์›ํ•œ๋‹ค๋Š” ๊ฐ€์ •์„ ์ถ”๊ฐ€ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

์ผ๋ฐ˜์ ์œผ๋กœ ๋‚˜๋ˆŒ์ˆ˜ ์žˆ๋Š” ๊ฑฐ์Šค๋ฆ„๋ˆ์€ ํฐ๋‹จ์œ„ ๋ถ€ํ„ฐ ๋‚˜๋ˆ ์ฃผ๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•˜์ฃ , ๋˜ 7๊ฐ™์€ 10๋‹จ์œ„์— ๋ฒ—์–ด๋‚˜๋Š” ๋™์ „์„ ์‚ฌ์šฉํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๊ธฐ๋„ ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

 

์ •๋ฆฌํ•ด๋ณด๋ฉด ๊ทธ๋ฆฌ๋”” ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ํ•ญ์ƒ ์ตœ์ ์˜ ํ•ด๋ฅผ ๋ณด์žฅํ•˜์ง€ ์•Š๋Š” ์ด์œ ๋Š”, ์•ž์—์„œ ๋งํ•œ ๊ทธ๋ฆฌ๋”” ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ๋…ผ๋ฆฌ ๋–„๋ฌธ์ž…๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๋”” ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๊ฐ ๋‹จ๊ณ„์—์„œ ๋‹จ์ง€ "์ง€์—ญ์ ์œผ๋กœ" ์ตœ์ ์˜ ์„ ํƒ์„ ํ•œ๋‹ค๋Š” ๋ฐ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด "์ง€์—ญ์ ์œผ๋กœ ์ตœ์ "์ด๋ผ๋Š” ๊ฐœ๋…์ด ๊ทธ๋ฆฌ๋”” ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ๊ฐ•์ ์ด์ž ์•ฝ์ ์ž…๋‹ˆ๋‹ค.

 



728x90