https://www.acmicpc.net/problem/1334
풀이:
문자열 S를 받아온다.
S의 길이를 N이라고 하자.
S의 오른쪽 절반의 값을 왼쪽 절반의 값으로 덮어쓰자.
그렇게 만들어진 문자열을 A라고 하자.
A는 이미 펠린드롬 수 인데, 이 수가 S보다 크다면 A를 그대로 출력한다.
만약 S보다 작다면,
가운데 수를 1씩 증가시킨다.
가운데 수가 9가 됐다면, 0으로 바꾸고 오른쪽, 왼쪽 수를 1씩 증가시킨다.
더 커질 때까지 반복한 후 A를 출력한다.
만약 S가 9로만 이루어진 수라면, 맨 앞수를 1로 바꾸고 그 것을 제외한 모든수를 0으로 바꾼 후 1을 추가한 후 출력한다.
EX) 999 -> 1001
코드:
사용언어 : c++
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
29
30
31
32
33
|
#include <iostream>
using namespace std;
int n, i, f; string s, a;
int main() {
cin >> s;
a = s;
n = a.size();
string p(n, '9');
if (a == p) {
for (i = 0; i < n; i++) a[i] = '0';
a[0] = '1', a += '0', n++;
s.insert(s.begin(), '0');
}
for (i = n - 1; i >= n / 2; i--) a[i] = a[n - i - 1];
for (i = 0; i < n; i++)
if (a[i]!=s[i]) {
f = a[i] > s[i];
break;
}
for (i = n / 2; !f && i < n; i++) {
if (a[i] > s[i] || a[n - i - 1] > s[n - i - 1]) break;
if (a[i] == '9') {
if (!(n % 2) || i != n / 2) a[n - i - 1] = '0';
a[i] = '0';
continue;
}
if (a[i] <= s[i]) {
if (i != n - i - 1) a[n - i - 1]++;
a[i]++, i--;
}
}
cout << a << endl;
}
|