다음 팰린드롬 수

난이도

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))))