YS's develop story

그리디 μ•Œκ³ λ¦¬μ¦˜ 정리 λ³Έλ¬Έ

Algorithm

그리디 μ•Œκ³ λ¦¬μ¦˜ 정리

Yusang 2021. 8. 13. 09:18

πŸ‘©‍πŸ’» 그리디 μ•Œκ³ λ¦¬μ¦˜ (νƒμš•λ²•) 정리 with Python

πŸ₯ 그리디 μ•Œκ³ λ¦¬μ¦˜ (Greedy Algorithm)μ΄λž€? 

1. 맀 μˆœκ°„ 졜적이라고 μƒκ°λ˜λŠ” 경우λ₯Ό μ„ νƒν•˜λŠ” λ°©μ‹μœΌλ‘œ μ§„ν–‰ν•΄μ„œ μ΅œμ’…μ μΈ 값을 κ΅¬ν•˜λŠ” λ°©μ‹μž…λ‹ˆλ‹€.

 

2. 각각의 선택은 κ·Έ μˆœκ°„ λ³΄μ•˜μ„ λ•ŒλŠ” κ°€μž₯ μ’‹μ•„ λ³΄μ΄μ§€λ§Œ λ‚˜μ€‘μ—λŠ” 졜적의 ν•΄κ°€ 아닐 수 μžˆμŠ΅λ‹ˆλ‹€.

 

3. 즉 맀 μˆœκ°„μ˜ 선택은 locally optimal ν•˜μ§€λ§Œ globally optimalν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

그렇기에 κ·Έλ¦¬λ”” μ•Œκ³ λ¦¬μ¦˜μœΌλ‘œ μ΅œμ ν•΄λ₯Ό 얻을 수 μ—†λŠ” 것이 μ‘΄μž¬ν•©λ‹ˆλ‹€.

 

πŸ‹ 그리디 μ•Œκ³ λ¦¬μ¦˜ μ˜ˆμ‹œ 1 - 동전 문제

μ§€λΆˆν•΄μ•Ό ν•˜λŠ” 값이 7870원 일 λ•Œ κ°€μž₯ 적은 수의 돈으둜 μ§€λΆˆν•˜λŠ” 방법을

그리디 μ•Œκ³ λ¦¬μ¦˜μ„ ν™œμš©ν•˜μ—¬ ꡬ할 수 μžˆμŠ΅λ‹ˆλ‹€.
κ°€μž₯ ν°λˆλΆ€ν„° μ΅œλŒ€ν•œ μ§€λΆˆν•΄μ•Ό ν•˜λŠ” 값을 μ±„μš°λŠ” λ°©μ‹μœΌλ‘œ κ΅¬ν˜„λ˜λ©°
그리디 μ•Œκ³ λ¦¬μ¦˜μœΌλ‘œ 맀 μˆœκ°„ 졜적이라고 μƒκ°λ˜λŠ” 경우λ₯Ό μ„ νƒν•˜λ©΄ λ©λ‹ˆλ‹€. 

 

🍊 동전 문제 μ½”λ“œ

# Greedy1 - Coin Problem

coinList = [5000, 1000, 500, 100, 50, 10]


def greedy1(conList, value):
    conList.sort(reverse=True)
    totalCount = 0
    details = list()

    for i in conList:
        count = value // i
        totalCount += count
        value -= count * i
        details.append([i, count])

    return totalCount, details


print(greedy1(coinList, 7870))

 

πŸ‰ 그리디 μ•Œκ³ λ¦¬μ¦˜ μ˜ˆμ‹œ 2 -  Fractional Knapsack Problem

무게 μ œν•œμ΄ k인 배낭에 μ΅œλŒ€ κ°€μΉ˜λ₯Ό 가지도둝 물건을 λ„£λŠ” λ¬Έμ œμž…λ‹ˆλ‹€.

각 물건은 무게 w와 κ°€μΉ˜ v둜 ν‘œν˜„λ  수 μžˆμŠ΅λ‹ˆλ‹€.

물건을 μͺΌκ°€ 수 있고 물건의 일뢀뢄을 배낭에 넣을 수 μžˆμŠ΅λ‹ˆλ‹€.

πŸ‹ Fractional Knapsack Problem μ½”λ“œ

# Greedy2 - Fractional Knapsack Problem

dataList = [(10, 10), (15, 12), (20, 10), (25, 8), (30, 5)]


def knapsack(dataList, capacity):
    dataList = sorted(dataList, key=lambda x: x[1] / x[0], reverse=True)
    details = list()
    totalValue = 0

    for i in dataList:
        if capacity - i[0] >= 0:
            capacity -= i[0]
            totalValue += i[1]
            details.append([i[0], i[1], 1])
        else:
            fractions = capacity / i[0]
            totalValue += fractions * i[1]
            details.append([i[0], i[1], fractions])
            break
    return totalValue, details


print(knapsack(dataList, 30))

 

πŸ₯­ 그리디 μ•Œκ³ λ¦¬μ¦˜μ˜ ν•œκ³„

그리디 μ•Œκ³ λ¦¬μ¦˜μ€ λ°˜λ“œμ‹œ 졜적의 ν•΄λ₯Ό ꡬ할 수 μžˆλŠ” μ•Œκ³ λ¦¬μ¦˜μ΄ μ•„λ‹™λ‹ˆλ‹€.

κ·Έ μˆœκ°„μ— κ°€μž₯ μ’‹μ•„ λ³΄μ΄λŠ” 선택을 톡해 졜적의 해에 κ°€κΉŒμš΄ 값을 κ΅¬ν•˜λŠ” μ•Œκ³ λ¦¬μ¦˜μž…λ‹ˆλ‹€.

그렇기에 그리디 μ•Œκ³ λ¦¬μ¦˜μœΌλ‘œλŠ” μ΅œμ ν•΄λ₯Ό ꡬ할 수 μ—†λŠ” λ¬Έμ œλ„ μžˆμŠ΅λ‹ˆλ‹€.

 

μœ„ κ·Έλž˜ν”„μ—μ„œ κ°€μž₯ μž‘μ€ 값을 μ°Ύμ•„ leaf nodeκΉŒμ§€ κ°€λŠ” 경둜λ₯Ό μ°ΎλŠ” λ¬Έμ œμ—μ„œ...

그리디 μ•Œκ³ λ¦¬μ¦˜μœΌλ‘œ κ°€μž₯ μž‘μ€ 값을 μ°Ύμ•„ 경둜λ₯Ό μ°ΎλŠ”λ‹€λ©΄ 7 -> 12 = 19 일 κ²ƒμž…λ‹ˆλ‹€.

ν•˜μ§€λ§Œ μ‹€μ œλ‘œ κ°€μž₯ μž‘μ€ 값은 10 -> 5이며 15κ°€ κ΅¬ν•˜κ³ μž ν•˜λŠ” κ°’μž…λ‹ˆλ‹€. 

Comments