Algorithm
[알고리즘] ch03. 그리디 알고리즘(Greedy Algorithm)
도토오오리
2023. 8. 4. 17:40
<이것이 코딩테스트다 with 파이썬> 책 내용을 바탕으로 작성된 글입니다.
그리디 알고리즘이란?
현재 상황에서 지금 당장 좋은 것만 고르는 방법이다. 매 순간 가장 좋아 보이는 것을 선택하며, 현재의 선택이 나중에 미칠 영향에 대해서는 고려하지 않는다.
그리디 알고리즘은 100% 최적해를 보장해주지 않는다. 때문에 그리디 알고리즘은 최적해를 구하는 데 근사하는 방법이기도 하다.
탐욕적 알고리즘 문제를 해결하는 방법
- 선택 절차(Selection Procedure): 현재 상태에서의 최적의 해답을 선택한다.
- 적절성 검사(Feasibility Check): 선택된 해가 문제의 조건을 만족하는지 검사한다.
- 해답 검사(Solution Check): 원래의 문제가 해결되었는지 검사하고, 해결되지 않았다면 선택 절차로 돌아가 위의 과정을 반복한다.
탐욕 알고리즘을 적용하려면 문제가 다음 2가지 조건을 성립하여야 한다.
- 탐욕적 선택 속성(Greedy Choice Property): 앞의 선택이 이후의 선택에 영향을 주지 않는다.
- 최적 부분 구조(Optimal Substructure): 문제에 대한 최종 해결 방법은 부분 문제에 대한 최적 문제 해결 방법으로 구성된다.
거스름돈 문제에 그리디 알고리즘의 문제 해결 과정을 적용
- 선택 절차: 거스름돈의 동전 개수를 최소로 하기 위해 가장 비싼 동전부터 선택한다.
- 적절성 검사: 1번 과정을 통해 선택된 동전들의 합이 거슬러 줄 금액을 초과하는지 검사한다. 초과하면 가장 마지막에 선택한 동전을 삭제하고, 1번으로 돌아가 다음으로 비싼 동전을 선택한다.
- 해답 검사: 선택된 동전들의 합이 거슬러 줄 금액과 일치하는지 검사한다. 액수가 부족하면 1번 과정부터 다시 반복한다.
92p 큰 수의 법칙
#큰 수의 법칙
n, m, k = map(int, input().split()
array = list(map(int,input().split()))
array.sort()
sum = 0
count = 0
for _ in range(m):
if (count == 0):
sum += array[n-1]
count += 1
elif (count % k != 0):
sum += array[n - 1]
count += 1
else:
sum += array[n -2]
count += 1
print(sum)
96p 숫자 카드 게임
#숫자 카드 게임
n, m = map(int, input().split())
min_value = 0
for _ in range(n):
array = list(map(int, input().split()))
array.sort()
if (min_value < array[0]):
min_value = array[0]
print(min_value)
99p 1이 될때까지
#1이 될 때까지
n, k = map(int, input().split())
count = 0
while n != 1:
if (n % k == 0):
n //= k
else:
n -= 1
count += 1
print(count)