다음 팰린드롬 수
난이도
Gold 5
인증
문제
팰린드롬 수는 앞으로 읽어도, 뒤로 읽어도 같은 숫자이다. 101, 4, 6666와 같은 숫자는 팰린드롬 수이고, 10, 564, 15452와 같은 숫자는 아니다.
어떤 수 N이 주어질 때, N보다 큰 팰린드롬 수 중에서 가장 작은 수를 출력한다.
입력
첫째 줄에 N이 주어진다. N은 최대 50자리인 양의 정수이다. 첫 숫자는 0이 아니다.
출력
첫째 줄에 문제의 정답을 출력한다.
예제 입력
12345
예제 출력
12421
해설 및 후기
아이디어는 쉽게 떠올랐으나 분기를 처리하는 데 애를 먹었다. 테스트케이스가 매우 착한 편이라 바로 맞을 수 있었다. 시간 제한이 이렇게까지 길 필요가 없는데 아마 fake가 아닐까 싶다.
방식을 아주 간단하게 표현하자면, 문자열의 절반 부분을 뒤집은 것이 나머지 절반보다 작다면, 단순하게 절반 부분 + 뒤집은 부분의 문자열을 출력한다(문자열의 갯수가 홀수인지 짝수인지에 따라 구현이 약간 달라진다)
만약 그렇지 않아서 수를 더 키워야 한다면, 문자열의 길이가 홀수인 경우 중간 부분만을 1 더하여 해결 가능한지 판단하고 그렇지 않거나 짝수라면, 문자열의 절반 앞 부분에 1을 더해 문자열의 뒷부분을 구한다.
그리고 문자열의 길이가 1이거나, 9로만 이루어진 문자열에 대해 예외처리를 한다. (위 방식대로만 한다면 99와 같은 입력에서 1001이 나온다. 정답은 101)
제출 코드
n = input()
half = len(n)//2
chk = True
for i in n:
if(i != '9'):
chk = False
if(chk):
print(1,end='')
for i in range(len(n)-1):
print(0,end='')
print(1)
exit()
if(len(n) == 1):
print(int(n)+1)
exit()
if(int(''.join(reversed(n[:half]))) > int(n[-half:])):
if(len(n)%2 == 0):
print(n[:half],end='')
print(''.join(reversed(n[:half])))
else:
print(n[:half+1],end='')
print(''.join(reversed(n[:half])))
elif(int(''.join(reversed(n[:half]))) <= int(n[-half:])):
if(len(n)%2 == 1):
if(n[half]!='9'):
print(n[:half],end='')
print(int(n[half])+1,end='')
print(''.join(reversed(n[:half])))
else:
print(int(n[:half])+1,end='')
print(0,end='')
print(''.join(reversed(str(int(n[:half])+1))))
else:
print(int(n[:half])+1,end='')
print(''.join(reversed(str(int(n[:half])+1))))