본문 바로가기
Algorithm/Study

탐욕 알고리즘과 예제문제 (Swift)

by HaningYa 2021. 1. 20.
728x90

Greedy algorithm

최적의 해에 가까운 값을 구하기 위해 사용

여러 경우 중 하나를 결정해야 할 때 마다, 매 순간 최적이라고 생각되는 경우를 선택하는 방식으로 진행해서 최종적인 값을 구하는 방식

동적 계획법(DP)과 비교

길을 찾을때

  • 동적계획법: 모든 경우의 길을 전부 확인하고 최단 경로를 찾아서 출발
  • 탐욕법: 일단 출발하고 갈림길에 따라 최적의 경로로 생각되는 길을 선택

[출처 및 자세한 내용]

 

동적 계획법(Dynamic Programming)과 탐욕법(Greedy Algorithm)

0x1X28uI-8A6oGM7.jpeg가장 빨리 가는 길을 찾고 싶다. 한 가지 방법은 출발하기 전, 가는 거리와 신호등, 교통 상황 등을 전부 계산해서 최적의 길을 찾는 것이다. 머리가 깨질 듯이 전부 확인하고 길

velog.io

예제 1. 동전문제

//동전문제
let coinList = [500, 100, 50, 1]

print(minCoinCount(4720,coinList))

func minCoinCount(_ value: Int,_ coinList : [Int]) -> Int {
    var value = value
    var coinList = coinList
    
    var totalCoinCount = 0
    var details : [(Int,Int)] = []
    //decrease order
    coinList.sort(by: >)
    
    //동전 큰걸 최대한 사용한다.
    for coin in coinList {
        //큰것 부터 사용한다.
        let coinCount = value/coin
        totalCoinCount += coinCount
        value -= coinCount * coin
        details.append((coin,coinCount))
    }
    print(details)
    return totalCoinCount
}

output

[(500, 9), (100, 2), (50, 0), (1, 20)]
31

예제 2. 부분 배낭 문제 (Fractional Knapsack Problem)

//(무게,가치)
var dataList :[(Double,Double)] = [(10,10),(15,12),(20,10),(25,8),(30,5)]

func getMaxValue(_ dataList : [(Double,Double)], _ capacity : Double) -> Double {
    var dataList = dataList
    var capacity = capacity
    var totalValue : Double = 0
    var details : [(Double,Double)] = []
    //무게 대비 가치가 높은 순서대로 소팅 -> 무게/가치
    dataList.sort { $0.0/$0.1 < $1.0/$1.1 }
    for data in dataList {
        if capacity - data.0 >= 0 {
            capacity -= data.0
            totalValue += data.1
            details.append(data)
        }else {
            let fraction = capacity / data.0
            totalValue += data.1 * fraction
            details.append((data.0, fraction))
            break
        }
    }
    print(details)
    return totalValue
}

print(getMaxValue(dataList, 30))

output

[(10.0, 10.0), (15.0, 12.0), (20.0, 0.25)]
24.5

주의할점

최적해에 가까운 값을 구하는것이지 항상 최적해를 찾는 건 아님

ex) 트리에서 root 에서 leaf까지 가장 작은 값을 찾아 가는 경로 찾을 때

 

728x90

'Algorithm > Study' 카테고리의 다른 글

LinkedList (Swift)  (0) 2021.01.28
다익스트라 알고리즘  (0) 2021.01.21
Graph Swift (BFS, DFS)  (0) 2021.01.20
Swift Heap  (0) 2021.01.18
이진트리 연산  (0) 2021.01.16

댓글