▫️그리디 알고리즘 (탐욕법)

<aside> 💡 그리디란!

▫️ [예제] 백준 5585번 거스름돈

5585번: 거스름돈

이 문제를 보면, ‘최소 동전갯수’로 거스름돈을 주어야합니다. 그렇게 하기 위해서 가장 좋은 방식은? ‘가장 큰 돈을 우선적으로 주는 것’이 가장 좋겠죠. 즉, 500원 짜리부터 아주 탐욕적으로 줘버린다는 소리가 바로 그리디입니다. (나머지 동전들은 고려하지 않은채 500원짜리 먼저 거슬러준다는 것! 500원짜리 이놈이 아주 욕심쟁이다~ 본인이 먼저 거슬러지려고한다~ 이렇게 생각했어요 전..)

👩🏻‍💻 내가 푼 풀이 (책이랑같군)

let wallet = [500, 100, 50, 10, 5, 1]

func giveChange(_ wallet: [Int]) -> Int {
    var result = 0
    var change = 1000 - Int(readLine()!)!
    for coin in wallet {
        let coinCount = change / coin
        result += coinCount
        change -= coin * coinCount
    }
    return result
}

print(giveChange(wallet))

▫️ [실전] 큰 수의 법칙 (p.92)

스크린샷 2022-10-12 오후 11.46.39.png

👩🏻‍💻 풀이

import Foundation

var nmk = readLine()!.split(separator: " ").map { Int($0)! }
var n = nmk[0]
var m = nmk[1]
var k = nmk[2]
var arr = readLine()!.split(separator: " ").map { Int($0)! }

var count = 0
var result = 0
arr.sort(by: >)

while true {
    if m == 0 { break }

    if count == k {
        result += arr[1]
        count = 0
        m -= 1
    } else {
        result += arr[0]
        count += 1
        m -= 1
    }
}

print(result)

<aside> ⚠️ 하지만 이렇게 했을 때, M의 범위가 100억 이상이 된다면 어떻게될까?

시간초과가 날 것이다. → 해결 방식을 생각해보자.

</aside>

  1. 규칙을 찾아보자.

  2. 수열을 바라보면서 수학적으로생각 하여 식을 간단하게 만들어줄 필요가 있다. (최대한 반복 연산을 줄여야 시간복잡도가 줄어들 것이다.)

    Untitled

👩🏻‍💻 시간복잡도를 줄인 효율적인 풀이