[Silver IV] 동전 0 - 11047
성능 요약
메모리: 69108 KB, 시간: 8 ms
분류
그리디 알고리즘
문제 설명
준규가 가지고 있는 동전은 총 N종류이고, 각각의 동전을 매우 많이 가지고 있다.
동전을 적절히 사용해서 그 가치의 합을 K로 만들려고 한다. 이때 필요한 동전 개수의 최솟값을 구하는 프로그램을 작성하시오.
입력
첫째 줄에 N과 K가 주어진다. (1 ≤ N ≤ 10, 1 ≤ K ≤ 100,000,000)
둘째 줄부터 N개의 줄에 동전의 가치 Ai가 오름차순으로 주어진다. (1 ≤ Ai ≤ 1,000,000, A1 = 1, i ≥ 2인 경우에 Ai는 Ai-1의 배수)
출력
첫째 줄에 K원을 만드는데 필요한 동전 개수의 최솟값을 출력한다.
풀이
동전 개수의 최솟값을 찾기 위해선 큰 값으로 나눠질 수 있는 값들을 큰 값으로 나눠야하는 것입니다.
해당 값보다 작은 동전을 모두 배열에 담고, 내림차순으로 정렬합니다. 그리고 값을 나누면서 차례대로 몫을 구합니다.
만약 값이 0이 된다면 종료시킵니다.
예를 들어 4200원이 있다면, 1000원 4개와 100원 2개로 나눈 값이 동전 개수의 최솟값이 될 것입니다.
다음은 코드입니다.
let nk = readLine()!.split(separator: " ").map { Int($0)! }
var (n, k) = (nk[0], nk[1])
var (money, ans) = ([Int](), 0)
for _ in 0..<n {
let input = Int(readLine()!)!
if input <= k { // k보다 큰 값은 굳이 필요 없음
money.append(input)
} else { // 큰 값 나오면 break
break
}
}
money.sort(by: >) // 내림차순으로 정렬
while k != 0 { // k가 0이 될 때까지
ans += k / money.first!
k %= money.first!
money.removeFirst()
}
print(ans)
728x90
'PS > BOJ' 카테고리의 다른 글
[백준(BOJ)] 1339 단어 수학 - 스위프트(Swift) (0) | 2023.09.05 |
---|---|
[백준(BOJ)] 19539 사과나무 - 스위프트(Swift) (0) | 2023.09.05 |
[백준(BOJ)] 1874 스택 수열 - 스위프트(Swift) (0) | 2023.09.01 |
[백준(BOJ)] 20922 겹치는 건 싫어 - 스위프트(Swift) (0) | 2023.09.01 |
[백준(BOJ)] 21921 블로그 - 스위프트(Swift) (0) | 2023.09.01 |