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

 

이번에 볼 문제는 백준 1334번 문제인 다음 팰린드롬 수이다.
문제는 아래 링크를 확인하자.

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

 

1334번: 다음 팰린드롬 수

팰린드롬 수는 앞으로 읽어도, 뒤로 읽어도 같은 숫자이다. 101, 4, 6666와 같은 숫자는 팰린드롬 수이고, 10, 564, 15452와 같은 숫자는 아니다. 어떤 수 N이 주어질 때, N보다 큰 팰린드롬 수 중에서 가

www.acmicpc.net

주어진 수의 (적절한) 앞자리를 대칭시켜 만들어지는 수가 기존 수보다 크다면 해당 수가 문제의 답이 될 것이다.

 

그렇지 않다면 이 앞자리의 값을 1 증가시킨 뒤 대칭시켜 만들어지는 수가 문제의 답이 될 것이다.

 

주어지는 정수의 자릿수가 매우 크므로 문자열으로 입력받아 문제를 해결하자. 또한 위의 과정에서 1을 더하는 것을 구현할 때, 99999와 같이 '9'로만 이루어진 수의 경우 답의 자릿수가 변할 수 있음에 유의해 구현하자.

 

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

#include <iostream>
#include <string>
#include <algorithm>
using namespace std;

int slen, mid;
string s;

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

	cin >> s;
	bool all9 = 1;
	for (auto& l : s) {
		if (l != '9') all9 = 0;
	}
	if (all9) {
		for (auto& l : s) l = '0';
		s = "1" + s;
	}

	slen = s.length();
	if (slen & 1) {
		string tmp = s.substr(0, slen / 2);
		reverse(tmp.begin(), tmp.end());
		tmp = s.substr(0, slen / 2) + s[slen / 2] + tmp;
		if (s < tmp) cout << tmp;
		else {
			for (int i = slen / 2; i > -1; i--) {
				if (s[i] == '9') s[i] = '0';
				else {
					s[i]++;
					break;
				}
			}

			tmp = s.substr(0, slen / 2);
			reverse(tmp.begin(), tmp.end());
			cout << s.substr(0, slen / 2) + s[slen / 2] + tmp;
		}
	}
	else {
		string tmp = s.substr(0, slen / 2);
		reverse(tmp.begin(), tmp.end());
		tmp = s.substr(0, slen / 2) + tmp;
		if (s < tmp) cout << tmp;
		else {
			for (int i = slen / 2 - 1; i > -1; i--) {
				if (s[i] == '9') s[i] = '0';
				else {
					s[i]++;
					break;
				}
			}

			tmp = s.substr(0, slen / 2);
			reverse(tmp.begin(), tmp.end());
			cout << s.substr(0, slen / 2) + tmp;
		}
	}
}
728x90

'BOJ' 카테고리의 다른 글

[BOJ 23059 // C++] 리그 오브 레게노  (0) 2023.08.01
[BOJ 1322 // C++] X와 K  (0) 2023.07.31
[BOJ 1323 // C++] 숫자 연결하기  (0) 2023.07.29
[BOJ 26937 // C++] Köpa Böcker  (0) 2023.07.28
[BOJ 26763 // C++] Liczby silne  (0) 2023.07.27

+ Recent posts