코테

코테_Chapter01_그리디

강용민 2022. 7. 19. 20:50

그리디 알고리즘은 어떠한 문제가 있을 때 단순 무식하게, 탐욕적으로 문제를 푸는 알고리즘이다. 여기서 탐욕적이라는 말은 '현재 상황에서 지금 당장 좋은 것만 고르는 방법'을 의미한다.

그리디 알고리즘은 기준에 따라 좋은 것을 선택하는 알고리즘이므로 문제에서 '가장 큰 순서대로','가장 작은 순서대로'와 같은 기준을 알게 모르게 제시해준다. 대체로 이 기준은 정렬 알고리즘을 사용했을 때 만족시킬 수 있으므로 그리디 알고리즘 문제는 자주 정렬 알고리즘과 짝을 이뤄 출제된다.

 

거스름돈

당신은 음식점의 계산을 도와주는 점원이다. 카운터에는 거스름돈을 사용할 500원, 1000원, 50원, 10원짜리 동전이 무한히 존재한다고 가정한다. 손님에게 거슬러 줘야 할 돈이 N원일 때 거슬러줘야 할 동전의 최소 개수를 구하라. 단, 거슬러 줘야 할 돈 N은 항상 10의 배수이다.

풀이

'가장 큰 화폐 단위로부터' 돈을 거슬러 주는 것이다. N원을 거슬러 줘야 할 때, 가장 먼저 500원으로 거슬러 줄 수 있을 만큼 거슬러 준다. 그다음 100원, 50원, 10원짜리 동전을 차례대로 거슬러 줄 수 있을 만큼 거슬러 주면 최소의 동전 개수로 모두 거슬러 줄 수 있다.

# 당신은 음식점의 계산을 도와주는 점원이다.
# 카운터에는 거스름돈을 사용할 500원, 1000원, 50원, 10원짜리 동전이 무한히 존재한다고 가정한다.
# 손님에게 거슬러 줘야 할 돈이 N원일 때 거슬러줘야 할 동전의 최소 개수를 구하라.
# 단, 거슬러 줘야 할 돈 N은 항상 10의 배수이다.

N = int(input())

coin_type = [500, 100, 50, 10]
cnt = 0

for coin in coin_type:
    cnt += N//coin
    N %= coin

print(cnt)

 

그리디 알고리즘의 정당성

대부분의 문제는 그리디 알고리즘을 이용했을 때 '최적의 해'를 찾을 수 없을 가능성이 다분하다. 하지만 거스름돈 문제에서 '가장 큰 화폐 단위부터'돈을 거슬러 주는 것과 같이, 탐욕적으로 문제에 접근했을 때 정확한 답을 찾을 수 있다는 보장이 있을 때는 매우 효과적이고 직관적이다.

그리디 알고리즘으로 문제의 해법을 찾았을 때는 그 해법이 정당한지 검토해야 한다. 거스름돈 문제를 그리디 알고리즘으로 해결할 수 있는 이유는 가지고 있는 동전 중에서 큰 단위가 항상 작은 단위의 배수이므로 작은 단위의 동전들을 종합해 다른 해가 나올 수 없기 때문이다.

 

큰 수의 법칙

큰 수의 법치은 다야한 수로 이루어진 배열이 있을 떄 주어진 수들을 M번 더하여 가장 큰 수를 만드는 법칙이다. 단, 배열의 특정한 인덱스에 해당하는 수가 연속해서 K번을 초과하여 더해질 수 없는 것이 이 법칙의 특징이다.

 

예시

입력조건

  • 첫째 줄에 N(2<= N <= 1,000), M(1<= M <= 10,000), K(1<=K<=10,000)의 자연수가 주어지며, 각 자연수는 공백으로 구분한다.
  • 둘째 줄에 N개의 자연수가 주어진다. 각 자연수는 공백으로 구분한다. 단, 각각의 자연수는 1이상 10,000 이하의 수로 주어진다.
  • 입력으로 주어지는 K는 항상 M보다 작거나 같다.

출력 조건

  • 첫째 줄에 동빈이의 큰 수의 법치에 따라 더해진 답을 출력한다.

풀이

N, M, K = map(int, input().split())
lst = list(map(int, input().split()))
res, cnt = 0, 0
lst.sort()

# #시간복잡도 O(n)
# for i in range(M):
#     if cnt <= K:
#         res += lst[-1]
#         cnt += 1
#     else:
#         res += lst[-2]
#         cnt = 0

# # 시간복잡도 O(1)
# cnt = M//(K+1) * K
# cnt += M % (K+1)

# res += cnt*lst[-1]
# res += (M-cnt)*lst[-2]

print(res)

 

 

 

'코테' 카테고리의 다른 글

코테_Baekjoon_21608_상어초등학교  (0) 2023.08.07
코테_BAEKJOON_14501_퇴사  (0) 2023.07.31
백준_No1075_나누기  (0) 2022.07.05
백준_No1009_분산처리  (0) 2022.07.05
백준_No1837_암호제작  (0) 2022.07.04