https://www.acmicpc.net/problem/11047
11047번: 동전 0
첫째 줄에 N과 K가 주어진다. (1 ≤ N ≤ 10, 1 ≤ K ≤ 100,000,000) 둘째 줄부터 N개의 줄에 동전의 가치 Ai가 오름차순으로 주어진다. (1 ≤ Ai ≤ 1,000,000, A1 = 1, i ≥ 2인 경우에 Ai는 Ai-1의 배수)
www.acmicpc.net
아주 직관적으로 풀어보았다.
#include <iostream>
using namespace std;
int N;
int K;
int arr[1000001] = { 0, };
int main() {
cin >> N >> K;
for (int i = 1; i < N+1; i++) {
cin >> arr[i];
}
int cnt = 0; //최소 동전 개수
int current = 0;
int sum = 0;
while (1) {
sum = 0;
for (int i = 1; i < N + 1; i++) {
if (arr[i] > K) {
current = i - 1; // K보다 작은 수 중 가장 큰 수 찾기
break;
}
}
while (sum <= K) { // 가장 큰 동전이 몇 개 필요한지 확인
sum += arr[current];
cnt++;
}
sum -= arr[current];
cnt--; // 마지막 동전을 한번 더 더했으므로 빼주기
K = K- sum; // 값 갱신
if (K== 0) break; //동전을 모두 더해서 값이 0이 되었으면 반복문 탈출
}
cout << cnt;
}
정말 효율적이지 못한 코딩. 예제는 통과하지만 제출 시 시간 초과 난다.
https://m.blog.naver.com/PostView.nhn? blogId=occidere&logNo=220802824513&proxyReferer=https% 3A% 2F%2Fwww.google.com% 2F
[백준] 11047 - 동전 0
문제 링크 : https://www.acmicpc.net/problem/11047 이 문제는 여태까지 풀었던 동전 시리즈와 비슷한 문...
blog.naver.com
을 참고하였다.
#include <iostream>
using namespace std;
int N;
int K;
int M = 0;
int arr[1000001] = { 0, };
int main() {
cin >> N >> K;
for (int i = 1; i < N+1; i++) {
cin >> arr[i];
}
for (int i = N; i > 0; i--) { // ex) 4200 원에서
M += K / arr[i]; // arr[i] 가 4200 보다 크면 0이 더해짐.
//arr[i] 가 K 보다 작으면 4200 / 1000 => 4 (횟수) 가 M에 더해짐
K = K % arr[i]; // 4200 % 1000 이면 나머지 200 원이 K에 갱신
//만약 4200 % 5000 이였으면 나머지인 4200 그대로
}
cout << M;
}
4200 / 1000 * 4에서 4가 최소 연산 횟수에 더해질 것이다.
남은 200에서는 100 * 2에서 2가 최소 연산 횟수에 더해질 것이다.
/, % 을 사용하여 아래와 같이 깔끔하게 정리가 가능하다.
'알고리즘' 카테고리의 다른 글
프로그래머스 - 정렬 - 가장 큰 수 (0) | 2021.02.14 |
---|---|
프로그래머스 : 완주하지 못한 선수 (0) | 2019.10.15 |
프로그래머스 : 전화번호 목록 (0) | 2019.10.15 |
백준 1149번 : RGB거리 (0) | 2019.10.15 |
백준 1463번 : 1로 만들기 (0) | 2019.10.15 |