CS기초/알고리즘

그리디 알고리즘

오늘의 나1 2021. 3. 1. 16:15
출처:
- 이것이 취업을 위한 코딩테스트다 with Python
https://youtu.be/5OYlS2QQMPA

그리디 알고리즘

  • 현재 상황에서 지금 당장 좋은 것만 고르는 방식
  • 지금 당장 좋은 것만 골라도 최적해가 나올 수 있는 문제를 풀 때 적합
  • 전체 경우의 수를 고려해서 최적해를 구해야하는 문제를 풀 때는 부적합

그리디 알고리즘이 부적합 문제

  • 문제: 루트 노드부터 시작하여 거쳐가는 노드의 합을 최대로 만들고자 할 때, 최대의 값은 무엇인가?
  • 최적해는 21 (5 -> 7 -> 9) 인 데, 그리디 알고리즘을 적용하면 19 (5 -> 10 -> 4)가 나와 최적해를 구할 수 없음
  • 지금 당장 좋은 것을 골라도, 다음 단계에서 역전 가능성이 있으므로 그리디 알고리즘에는 부적합
최적해: 21 (5 -> 7 -> 9)  그리디 알고리즘을 적용한 경우: 21 (5 -> 10 -> 4)

 

 

문제

예제1. 거스름돈(하)

  • 문제: 당신은 음식점의 계산을 도와주는 점원입니다. 카운터에는 거스름돈으로 사용할 500원, 100원, 50원, 10원짜리 동전이 무한히 존재한다고 가정합니다. 손님에게 거슬러 주어야할 돈이 N원일 때 거슬러 주어야할 동전의 최소 갯수를 구하시오. 단, 거슬러 줘야할 돈 N은 항상 10의 배수입니다.
  • 그리디 알고리즘으로 답을 구할 수 있는 이유: 동전 중에서 큰 단위가 항상 작은 단위의 배수이므로, 작은 단위의 동전들을 종합해 다른 해가 나올 수 없기 때문
  • 만약 800원을 거슬러 줘야 하는 데, 동전의 단위가 500, 400, 100이라면 그리디 알고리즘으로 해를 구할 수 없음
n = 1260
count = 0

coins = [500, 100, 50, 10]

for coin in coins:
    count += n // coin
    n %= coin
    
print(count)

실전1. 큰 수의 법칙(하)

출처: 이것이 취업을 위한 코딩테스트다 with Python p92

# n = 5
# m = 8
# k = 3
# arr = [2, 4, 5, 4, 6]
n = 5
m = 7
k = 2
arr = [3, 4, 3, 4, 3]

arr.sort(reverse=True)

answer = 0
if arr[0] == arr[1]:
    answer = arr[0] * m
else:
    answer = arr[0] * k * (m // k) + arr[1] * (m % k)
print(answer)

실전2. 숫자 카드 게임(하)

출처: 이것이 취업을 위한 코딩테스트다 with Python p96

# arr = [[3, 1, 2], [4, 1, 4], [2, 2, 2]]
arr = [[7, 3, 1, 8], [3, 3, 3, 4]]

answer = list(map(min, arr))
answer.sort(reverse=True)
print(answer[0])  

실전3. 1이 될 때까지(하)

출처: 이것이 취업을 위한 코딩테스트다 with Python p99

# n = 17
# k = 4
n = 25
k = 5
count = 0

while n > 1:
    if n % k == 0:
        count += 1
        n //= k
    else:
        count += (n % k)
        n -= (n % k)

print(count)

기타

python 문법 알게 된 것

  • 몫 구하기 연산자는 /이 아니라 //이다. 
    /을 할 경우 소숫점까지 반환하고, //을 해야 몫이 나온다
  • 오름차순 정렬을 할 경우, [1, 2, 3].sort(reverse=True)로 하면 된다.
    python 함수 호출 시 쓰고 싶은 옵션을 키 값으로 넣으면 되는 것 같다. (굳이 더미 파라미터 넣을 필요없음)
  • map을 한 리스트를 얻으려면 list(map(func = 실제함수, arr = 리스트))하면 된다.

 

'CS기초 > 알고리즘' 카테고리의 다른 글

이진탐색 알고리즘  (0) 2021.03.08