오늘의 학습 키워드
그리디란?
- 최적의 값을 구해야 하는 상황에서 사용되는 근시안적인 방법론으로 ‘각 단계에서 최적이라고 생각되는 것을 선택’ 해 나가는 방식으로 진행하여 최종적인 해답에 도달하는 알고리즘이다.
- 이때, 항상 최적의 값을 보장하는것이 아니라 최적의 값의 ‘근사한 값’을 목표로 하고 있다.
- 주로 문제를 분할 가능한 문제들로 분할한 뒤, 각 문제들에 대한 최적해를 구한 뒤 이를 결합하여 전체 문제의 최적해를 구하는 경우에 주로 사용된다.
https://www.acmicpc.net/problem/14916
거스름돈을 최소 동전 개수로 줄 수 있는 그리디 접근 방법을 사용한 풀이.
따라서 거스름돈 13원을 줄이기 위해 필요한 최소 동전 개수는 5개이다.
1. 입력값 받기
n = int(input())
: 거스름돈의 액수를 입력받습니다.2. 반복문을 통한 거스름돈 계산
cnt = 0
: 사용할 동전의 개수를 저장하는 변수. 처음에는 0으로 초기화.
while True:
: 거스름돈을 거슬러 줄 때까지 무한 반복.
조건 1: if n % 5 == 0:
먼저 거스름돈 n이 5로 나누어떨어지는지 확인.
만약 n이 5로 나누어떨어지면, 가능한 최대 개수의 5원 동전을 사용할 수 있다는 의미.
cnt += n // 5: 5원짜리 동전을 사용할 수 있는 개수를 cnt에 추가.
break: 이후 반복문을 종료합니다.
조건 2: else:
만약 n이 5로 나누어떨어지지 않으면, 2원짜리 동전을 사용하여 거스름돈을 줄임.
n -= 2: 2원짜리 동전을 하나 사용하고, 거스름돈에서 2원을 뺌.
cnt += 1: 동전 개수를 하나 증가.
조건 3: if n < 0:
만약 거스름돈이 음수가 되면 더 이상 거슬러 줄 수 없다는 의미이므로 반복을 종료.
break로 반복문을 빠져나가기.
3. 결과 출력
if n < 0:
: 반복문이 종료된 후 거스름돈이 음수(n < 0)라면, 주어진 동전으로 거슬러 줄 수 없으므로 -1을 출력.else: print(cnt)
: 거스름돈을 모두 거슬러 줄 수 있었다면, 최소 동전 개수(cnt)를 출력.왜 그리디로 풀까?
이 문제에서 항상 큰 단위의 동전부터 사용해도 최적의 해를 구할 수 있기 때문에 그리디 알고리즘이 적합하다.
큰 단위 동전(5원)을 최대한 먼저 사용하면, 동전의 총 개수를 최소화할 수 있다.
따라서 이 문제는 매 순간 최선의 선택을 함으로써 최적의 해를 찾는 그리디 알고리즘으로 풀 수 있다.
n = int(input())
cnt = 0
while True:
if n % 5 == 0:
cnt += n // 5
break
else:
n -= 2
cnt += 1
if n < 0:
break
if n < 0:
print(-1)
else:
print(cnt)
🔥 그냥 원래 생각대로 풀면서? 답에 최대한 가깝게 빨리 구해지는 방법이 그리디인 것 같다..정확한 목표에 대한 빠른 문제 해결 방법?