๐Ÿค–/์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ •๋ฆฌ

๊ทธ๋ฆฌ๋”” ์•Œ๊ณ ๋ฆฌ์ฆ˜ (Greedy Algorithm)

sssbin 2021. 9. 23. 16:50

 

๊ทธ๋ฆฌ๋”” ์•Œ๊ณ ๋ฆฌ์ฆ˜(ํƒ์š•๋ฒ•): ํ˜„์žฌ ์ƒํ™ฉ์—์„œ ์ง€๊ธˆ ๋‹น์žฅ ์ข‹์€ ๊ฒƒ๋งŒ ๊ณ ๋ฅด๋Š” ๋ฐฉ๋ฒ•

- ๊ทธ๋ฆฌ๋”” ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฌธ์ œ์—์„œ๋Š” ๋ฌธ์ œ ํ’€์ด๋ฅผ ์œ„ํ•œ ์ตœ์†Œํ•œ์˜ ์•„์ด๋””์–ด๋ฅผ ๋– ์˜ฌ๋ฆฌ๊ณ  ์ด๊ฒƒ์ด ์ •๋‹นํ•œ์ง€ ๊ฒ€ํ† ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค.

 

ex) ๊ฑฐ์Šค๋ฆ„๋ˆ ๋ฌธ์ œ - ๊ฐ€์žฅ ํฐ ํ™”ํ ๋‹จ์œ„๋ถ€ํ„ฐ ๋ˆ์„ ๊ฑฐ์Šฌ๋Ÿฌ ์คŒ

         ใ„ด ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๋™์ „ ์ค‘์—์„œ ํฐ ๋‹จ์œ„๊ฐ€ ํ•ญ์ƒ ์ž‘์€ ๋‹จ์œ„์˜ ๋ฐฐ์ˆ˜์ด๋ฏ€๋กœ ์ž‘์€ ๋‹จ์œ„๋“ค์„ ์ข…ํ•ฉํ•ด ๋‹ค๋ฅธ ํ•ด๊ฐ€ ๋‚˜์˜ฌ ์ˆ˜ ์—†๋‹ค!

n = int(input())
cnt = 0
coin = [500, 100, 50, 10]

for i in coin:	# ์‹œ๊ฐ„ ๋ณต์žก๋„ O(K) <- ๋™์ „์˜ ์ข…๋ฅ˜ K๊ฐœ
    cnt += n // i
    n %= i

print(cnt)

 

์‹ค์ „ ๋ฌธ์ œ1. ํฐ ์ˆ˜์˜ ๋ฒ•์น™

n, m, k = map(int, input().split())
num = list(map(int, input().split()))
res = 0

num.sort()
first = num[n-1]
second = num[n-2]

while True:
    for i in range(k):
        if m == 0:
            break
        res += first
        m -= 1

    if m == 0:
        break

    res += second
    m -= 1

print(res)

- ์ž…๋ ฅ๊ฐ’ ์ค‘์—์„œ ๊ฐ€์žฅ ํฐ ์ˆ˜์™€ ๋‘ ๋ฒˆ์งธ๋กœ ํฐ ์ˆ˜๋งŒ ์ €์žฅํ•˜๋ฉด ๋œ๋‹ค.

- ๊ฐ€์žฅ ํฐ ์ˆ˜ K๋ฒˆ + ๋‘ ๋ฒˆ์งธ๋กœ ํฐ ์ˆ˜ 1๋ฒˆ ๋ฐ˜๋ณต

* M์˜ ํฌ๊ธฐ๊ฐ€ ์ปค์งˆ ๊ฒฝ์šฐ ์‹œ๊ฐ„ ์ดˆ๊ณผ ํŒ์ •. ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์œผ๋กœ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ด๋ณด์ž.

n, m, k = map(int, input().split())
num = list(map(int, input().split()))
res = 0

num.sort()
first = num[n-1]
second = num[n-2]

cnt = m // (k + 1) * k + m % (k + 1)    # ๊ฐ€์žฅ ํฐ ์ˆ˜ ๋”ํ•˜๋Š” ํšŸ์ˆ˜
res += cnt * first + (m - cnt) * second # ๋”ํ•˜๊ธฐ

print(res)

๋‘ ๋ฒˆ์งธ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ทœ์น™

 

์‹ค์ „ ๋ฌธ์ œ2. ์ˆซ์ž ์นด๋“œ ๊ฒŒ์ž„

n, m = map(int, input().split())
res = 0

for i in range(n):
        cards = list(map(int, input().split()))
        if res < min(cards):
                res = min(cards)

print(res)

- ๊ฐ ํ–‰๋งˆ๋‹ค ๊ฐ€์žฅ ์ž‘์€ ์ˆ˜๋ฅผ ์ฐพ์€ ๋’ค์— ๊ทธ ์ˆ˜ ์ค‘์—์„œ ๊ฐ€์žฅ ํฐ ์ˆ˜๋ฅผ ์ฐพ๋Š”๋‹ค.

 

์‹ค์ „ ๋ฌธ์ œ3. 1์ด ๋  ๋•Œ๊นŒ์ง€

n, k = map(int, input().split())
cnt = 0

while n != 1:
    if n % k == 0:
        n //= k
    else:
        n -= 1
    cnt += 1

print(cnt)

- ์ตœ๋Œ€ํ•œ ๋งŽ์ด ๋‚˜๋ˆ„๊ธฐ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋ฉด ๋œ๋‹ค.