※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※

 

이번에 볼 문제는 백준 1398번 문제인 동전 문제이다.
문제는 아래 링크를 확인하자.

https://www.acmicpc.net/problem/1398 

 

1398번: 동전 문제

첫째 줄에 테스트 케이스의 개수 T가 주어진다. 둘째 줄부터 T개의 줄에 초콜릿의 가격이 주어진다. 가격의 1015보다 작거나 같은 자연수이다.

www.acmicpc.net

작은 자릿수부터 두 자리씩 끊어읽을 때, 그 두자리 수를 1, 10 및 25를 이용해 구성하기 위해 필요한 최소 동전 수를 구해 더해나가는 것으로 문제를 해결하자.

 

이는 각 두 자리수에 25를 0개, 1개, 2개 및 3개 사용하고 남은 수의 각 자릿수의 합만큼 1 및 10을 이용해 두 자리수를 구성해보는 것으로 구할 수 있다. 또는 knapsack dp를 이용해 0 이상 100 미만의 정수에 대해 필요한 최소 동전 개수를 미리 전처리해두는 것도 좋다.

 

아래는 제출한 소스코드이다.

#include <iostream>
using namespace std;
typedef long long ll;

int T;

int main() {
	ios::sync_with_stdio(0);
	cin.tie(0);

	cin >> T;
	while (T--) {
		int ans = 0;
		ll x; cin >> x;
		while (x) {
			int cur = x % 100;
			x /= 100;
			int tmp = 1000000007;
			int cnt = 0;
			while (cur >= 0) {
				tmp = min(tmp, cur / 10 + cur % 10 + cnt);
				cur -= 25, cnt++;
			}
			ans += tmp;
		}

		cout << ans << '\n';
	}
}
728x90

'BOJ' 카테고리의 다른 글

[BOJ 5213 // C++] 과외맨  (0) 2023.06.29
[BOJ 16681 // C++] 등산  (0) 2023.06.28
[BOJ 5549 // C++] 행성 탐사  (0) 2023.06.26
[BOJ 1023 // C++] 괄호 문자열  (0) 2023.06.25
[BOJ 1138 // C++] 한 줄로 서기  (0) 2023.06.24

+ Recent posts