티스토리 뷰
문제
당신은 음식점의 계산을 도와주는 점원이다. 카운터에는 거스름돈으로 사용할 500원, 100원, 50원, 10원짜리 동전이 무한히 존재한다고 가정한다. 손님에게 거슬러 줘야 할 돈이 N원일 때, 거슬러줘야 할 동전의 최소 개수를 구해라. 단, 거슬러 줘야 할 돈 N은 항상 10의 배수이다.
풀이
탐욕적인 아이디어: 가장 큰 화폐 단위부터 돈을 거슬러준다.
코드
import Foundation
var n = Int(readLine()!)!
var result = 0
let coinTypes = [500, 100, 50, 10]
for coin in coinTypes {
result += (n / coin)
n %= coin
}
print(result)
분석
- 시간 복잡도 O(K)
- 시간 복잡도는 동전의 총 종류에만 영향을 받는다.
- 거슬러주어야하는 금액의 크기와는 무관하다.
그리디 알고리즘의 정당성
- 가지고 있는 동전 중에서 큰 단위가 항상 작은 단위의 배수이다.
- ex) 800원 → 500원 + 100*3이 최적
- ex) 화폐단위에 400원이 있다면 400*2가 최적임
- 따라서 작은 동전들을 종합해 다른 해가 나올 수 없다.
- 따라서 첫 아이디어 가장 큰 화폐부터 돈을 거슬러주는 것이 항상 최적의 해이기 때문에 정당하다.
이것이 코딩테스트다를 읽고 정리한 글입니다.
'Algorithm > [Swift] 이것이 코딩테스트다' 카테고리의 다른 글
[Greedy] 숫자 카드 게임 (0) | 2022.12.29 |
---|---|
[Greedy] 큰 수의 법칙 해설 (0) | 2022.12.29 |
[Algorithm] Greedy (탐욕법) (0) | 2022.12.29 |
[이진 탐색] 떡볶이 떡 자르기, Swift (0) | 2022.08.22 |
[이진 탐색] 부품 찾기, Swift (0) | 2022.08.22 |
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- COMMIT
- replit
- 이것이 코딩테스트다
- 리플릿
- 시간초과
- 프로그래머스
- 정답
- python
- level1
- 코드업
- SwiftUI
- baekjoon
- ord
- 기초 100제
- CodeUp
- 깃
- CHR
- 설명
- Code up
- 부르트포스
- for문
- 코드 업
- 레플릿
- 16진수 입력
- 반복문
- 파이썬
- Swift
- do while
- 백준
- 깃허브
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
글 보관함