※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※
이번에 볼 문제는 백준 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 |