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

 

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

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

 

주어진 수보다 큰 수 중 자릿수 '5'가 \(K\)개 이상 들어간 수를 찾는 문제이다.

어떤 자릿수 오른쪽을 모두 '5'로 채웠을 때 '5'가 필요한 개수만큼 등장할 수 있게 하는 가장 오른쪽의 자릿수를 찾아 '5'로 채우는 것을 시도하고, 자릿수 부족이나 크기의 감소 등의 이유로 실패하면 적절하게 자릿수를 증가시켜 재시도하는 것을 반복해 문제를 해결하자.

 

각 자리에 대한 조작 시도 횟수 상한이 일정하다는 점을 관찰하면 이와 같은 방식으로 코드를 작성해 문제를 충분히 해결할 수 있음을 알 수 있다.

 

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

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

string s; int K;

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

	cin >> s >> K;
	s = "00000000000000000000" + to_string(stoll(s) + 1);
	while (1) {
		int dgt = s.size(), KK = K;
		for (auto &l:s) {
			if (l == '5') KK--;
		}
		if (KK <= 0) {
			cout << stoll(s);
			return 0;
		}
		while (KK) {
			dgt--;
			if (s[dgt] != '5') KK--;
		}
		if (s[dgt] > '5') {
			for (int i = dgt; i < s.size(); i++) s[i] = '0';
			dgt--;
			s[dgt]++;
			while (s[dgt] > '9') {
				s[dgt] = '0';
				dgt--;
				s[dgt]++;
			}
		}
		else {
			while (dgt < s.size()) {
				s[dgt] = '5';
				dgt++;
			}
			cout << stoll(s);
			return 0;
		}
		s = "00000000000000000000" + to_string(stoll(s));
	}
}
728x90

'BOJ' 카테고리의 다른 글

[BOJ 17797 // C++] Dome Construction  (0) 2024.08.25
[BOJ 1999 // C++] 최대최소  (0) 2024.08.24
[BOJ 10379 // C++] Hiking in the Hills  (0) 2024.08.22
[BOJ 12111 // C++] Turnir  (0) 2024.08.21
[BOJ 25989 // C++] Jabbing Jets  (0) 2024.08.20

+ Recent posts