Greedy

CorinBeomยท2025๋…„ 5์›” 1์ผ

Algorithm

๋ชฉ๋ก ๋ณด๊ธฐ
15/15
post-thumbnail

๐Ÿ’ธ ๊ทธ๋ฆฌ๋”” ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ •๋ณตํ•˜๊ธฐ


1. ๊ทธ๋ฆฌ๋”” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ๋ญ๋ƒ?

"์ง€๊ธˆ ๋‹น์žฅ ๋ณด๊ธฐ์—” ์ œ์ผ ์ข‹์•„ ๋ณด์ด๋Š” ์„ ํƒ์„ ํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜"
๋‹ค์‹œ ๋งํ•˜๋ฉด, ๋งค ์ˆœ๊ฐ„ ์ตœ์„ ์˜ ์„ ํƒ์„ ๋ฐ˜๋ณตํ•˜๋Š” ๋ฐฉ์‹.

โœ”๏ธ ๊ฐ„๋‹จํ•˜์ง€๋งŒ, ๊ตฌ์กฐ ์ž˜๋ชป ์žก์œผ๋ฉด ํ‹€๋ฆด ์ˆ˜๋„ ์žˆ์Œ.


2. ์–ธ์ œ ์“ฐ๋Š” ๊ฑด๋ฐ?

๋‹ค์Œ ๋‘ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•  ๋•Œ๋งŒ ๊ทธ๋ฆฌ๋””๊ฐ€ ํ†ตํ•œ๋‹ค:

์กฐ๊ฑด์„ค๋ช…
โœ… Greedy Choice Property๋งค ์ˆœ๊ฐ„์˜ ์ตœ์„ ์ด ์ „์ฒด์ ์œผ๋กœ๋„ ์ตœ์„ ์ด์–ด์•ผ ํ•จ
โœ… Optimal Substructure๋ฌธ์ œ๋ฅผ ๋ถ€๋ถ„ ๋ฌธ์ œ๋กœ ์ชผ๊ฐœ๋„ ์„ฑ์งˆ์ด ์œ ์ง€๋ผ์•ผ ํ•จ

์‰ฝ๊ฒŒ ๋งํ•ด์„œ, ๊ทธ ์ˆœ๊ฐ„์˜ ์„ ํƒ์ด ์ „์ฒด ์ •๋‹ต์„ ๊นจ๋จน์œผ๋ฉด ๊ทธ๋ฆฌ๋””๋Š” ๋ชป ์”€.


3. ๊ทธ๋ฆฌ๋”” vs DP ์ฐจ์ด?

๊ตฌ๋ถ„๊ทธ๋ฆฌ๋””DP
์ „๋žต๋งค ์ˆœ๊ฐ„ ์ตœ์„ ์ „๋ถ€ ๊ณ ๋ คํ•ด์„œ ์ตœ์ 
์†๋„๋น ๋ฆ„๋А๋ฆด ์ˆ˜ ์žˆ์Œ
์ •๋‹ต ๋ณด์žฅํ•ญ์ƒ ๋˜๋Š” ๊ฑด ์•„๋‹˜์กฐ๊ฑด ๋งž์œผ๋ฉด ๋ณด์žฅ๋จ
์˜ˆ์‹œ๋™์ „ ๊ฑฐ์Šค๋ฆ„๋ˆ, ํšŒ์˜์‹ค ๋ฐฐ์ •๋ฐฐ๋‚ญ ๋ฌธ์ œ, ์ตœ์†Œ ๊ฑฐ๋ฆฌ, ๋“ฑ๋“ฑ

4. ์‹ค์ „ ์˜ˆ์ œ


๐Ÿช™ ์˜ˆ์ œ 1. ๊ฑฐ์Šค๋ฆ„๋ˆ ๋ฌธ์ œ (๊ฐ€์žฅ ๊ธฐ๋ณธ)

1260์›์„ ๋™์ „์œผ๋กœ ๊ฑฐ์Šฌ๋Ÿฌ์ค„ ๋•Œ, ๊ฐ€์žฅ ์ ์€ ๋™์ „ ๊ฐœ์ˆ˜๋Š”?

coins = [500, 100, 50, 10]
n = 1260
count = 0

for coin in coins:
    count += n // coin
    n %= coin

print(count)  # ์ถœ๋ ฅ: 6

โœ”๏ธ ํ•ต์‹ฌ์€ ํฐ ๋‹จ์œ„๋ถ€ํ„ฐ ๋จผ์ € ์“ฐ๋Š” ๊ฒƒ
โœ”๏ธ ์ด ๋ฌธ์ œ๋Š” ๋™์ „ ๋‹จ์œ„๊ฐ€ ๊ทธ๋ฆฌ๋”” ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋‹ˆ๊นŒ ์ •๋‹ต ๋‚˜์˜ด


๐Ÿข ์˜ˆ์ œ 2. ํšŒ์˜์‹ค ๋ฐฐ์ • (๋ฐฑ์ค€ 1931)

N๊ฐœ์˜ ํšŒ์˜๊ฐ€ ์‹œ์ž‘/๋ ์‹œ๊ฐ„์ด ์ฃผ์–ด์งˆ ๋•Œ, ๊ฒน์น˜์ง€ ์•Š๊ฒŒ ์ตœ๋Œ€ ๋ช‡ ๊ฐœ๊นŒ์ง€ ๋ฐฐ์ • ๊ฐ€๋Šฅ?

n = int(input())
meetings = [tuple(map(int, input().split())) for _ in range(n)]

# ์ข…๋ฃŒ ์‹œ๊ฐ„ ๊ธฐ์ค€์œผ๋กœ ์ •๋ ฌ
meetings.sort(key=lambda x: (x[1], x[0]))

count = 0
end_time = 0

for start, end in meetings:
    if start >= end_time:
        count += 1
        end_time = end

print(count)

โœ”๏ธ ๋๋‚˜๋Š” ์‹œ๊ฐ„์ด ๋น ๋ฅผ์ˆ˜๋ก โ†’ ์ดํ›„ ํšŒ์˜ ๋ฐฐ์ •ํ•  ์—ฌ์ง€๊ฐ€ ๋งŽ์•„์ง
โœ”๏ธ ๊ทธ๋ž˜์„œ ์ข…๋ฃŒ ์‹œ๊ฐ„ ๊ธฐ์ค€ ์ •๋ ฌ์ด ํ•ต์‹ฌ์ž„


๐Ÿงพ ์˜ˆ์ œ 3. ๋™์ „ 0 (๋ฐฑ์ค€ 11047)

N๊ฐœ์˜ ๋™์ „ ์ข…๋ฅ˜๋กœ K์›์„ ๋งŒ๋“ค ๋•Œ, ์ตœ์†Œ ๋™์ „ ๊ฐœ์ˆ˜ ๊ตฌํ•˜๊ธฐ

import sys
input = sys.stdin.readline

N, K = map(int, input().split())
coins = [int(input()) for _ in range(N)]
coins.sort(reverse=True)

count = 0
for coin in coins:
    count += K // coin
    K %= coin

print(count)

โœ”๏ธ ํฐ ๋‹จ์œ„๋ถ€ํ„ฐ ๋จผ์ € ์จ์•ผ ์ตœ์†Œ ๊ฐœ์ˆ˜
โœ”๏ธ ๋™์ „์ด ์ •๋ ฌ๋ผ ์žˆ๋‹ค๋Š” ๋ณด์žฅ ์—†์œผ๋‹ˆ๊นŒ sort(reverse=True) ๊ผญ ํ•ด์ค˜์•ผ ํ•จ


๐Ÿ”š ๋งˆ๋ฌด๋ฆฌ ์š”์•ฝ

  • ๊ทธ๋ฆฌ๋””๋Š” ์ƒ๊ฐ๋ณด๋‹ค ๊ฐ„๋‹จํ•˜์ง€๋งŒ,
    ์กฐ๊ฑด ์•ˆ ๋งž์œผ๋ฉด ํ‹€๋ฆฐ ๊ฒฐ๊ณผ ๋‚˜์˜ฌ ์ˆ˜ ์žˆ์Œ
  • ๊ทธ๋ž˜์„œ ํ•ญ์ƒ โ€œ์ด ์„ ํƒ์ด ์ „์ฒด ์ •๋‹ต์—๋„ ์œ ํšจํ•œ๊ฐ€?โ€ ์ฒดํฌ ํ•„์š”
  • ์กฐ๊ฑด ๋งŒ์กฑํ•˜๋ฉด ๊ทธ๋ฆฌ๋””๋Š” ์ง„์งœ ๋น ๋ฅด๊ณ  ๊น”๋”ํ•˜๊ฒŒ ํ’€๋ฆผ

๊ทธ๋ฆฌ๊ณ  ์‹ค์ „ ์ฝ”ํ…Œ์—์„œ๋Š”
DP? ๊ทธ๋ฆฌ๋””? ์ด๋ถ„ํƒ์ƒ‰? ํŒ๋‹จํ•˜๋Š” ๋Šฅ๋ ฅ์ด ์ง„์งœ ์‹ค๋ ฅ์ž„.

profile
Before Sunrise

0๊ฐœ์˜ ๋Œ“๊ธ€