티스토리 뷰

algorithm/problem solving

BOJ 11047 동전0

무니웜테일패드풋프롱스 2020. 4. 4. 21:34

이 문제는 설탕배달보다 더 간단한 그리디 문제이다. 왜냐하면 이 문제는, "만약 해당 값이 조건을 충족 못 시킬 시, 돌아와서 - 한다 " 라는게 없다. 

 

처음 풀었을 때는 동전 값 받으면서, k보다 작거나 같으면서 가장 큰 값을 구해서 k/max , k%max로 하고, 그 후 다시 배열을 돌면서 while문으로 동전 개수를 증가시키고, k값을 감소시켰다. (복잡..)

 

처음 제출한 알고리즘은 이러하다.

#include <iostream>
using namespace std;
int main(void) {
	int n, k;
	cin >> n;
	cin >> k;
	int coin[10];
	int max=0; //max와 max인덱스를 구한다
	int index = 0;
	for (int i = 0; i < n; i++) {
		cin >> coin[i];
		if (coin[i] > max && coin[i] <= k) { max = coin[i], index = i; };
	}

	int x = k / max; //max를 쓸 수 있는 개수 
	k = k % max; //max를 쓰고 남은 값
	for (int i = index-1; i >= 0; i--) { //for문 횟수 줄이려고 max인덱스 받았었음
		if (coin[i] > k) continue;  //k보다 크면 conitune
		else {
			while (coin[i] <= k) { //k보다  작거나 같을 동안
				x++; 
				k -= coin[i];
			}
			if (k == 0) break;
		}
	}
	cout << x;
}

하지만 더 간단하게 풀 수 있었다.

 

int main(void) {
	int n, k;
	cin >> n;
	cin >> k;
	int coin[10];
	for (int i = 0; i < n; i++) {
		cin >> coin[i];};

	int x = 0;
	for (int i = n-1; i >= 0; i--) {
		if (coin[i] > k) continue;
		x += k / coin[i];
		k = k % coin[i];
	}
	cout << x;
}

 

근데 알고리즘 시간은 동일했다.

아무튼 두번째 제출한게 더 직관적이다

'algorithm > problem solving' 카테고리의 다른 글

BOJ 1149 RGB거리  (0) 2020.04.05
BOJ 1764 듣보잡  (0) 2020.04.04
BOJ 2839 설탕배달  (0) 2020.03.31
BOJ 11866 요세푸스 문제 0  (0) 2020.03.22
B0J 1874 스택수열  (0) 2020.03.18
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/02   »
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
글 보관함