1334번: 다음 팰린드롬 수 (acmicpc.net)


## 풀이
N은 최대 50자리인 양의 정수이다
숫자가 매우 커서

def is_palindrome(k):
    len_div2 = len(k)//2
    if len(k)%2 == 0:
        if k[:len_div2] == k[len_div2:][::-1]:
            return True
    else:
        if k[:len_div2] == k[len_div2 + 1:][::-1]:
            return True
    return False

def sol():
    n = int(input()) + 1

    while(True):
        if is_palindrome(str(n)) == True:
            print(n)
            break
        n += 1
    return None

sol()
이런걸 내면 시간초과 된다. 문자열을 이용해서 풀었다.


## code
def sol():
    n = str(int(input()) + 1)

    # 들어오는 숫자가 최대 50자리인 양의 정수 - 매우 크다
    while(True):
        # 한자리면 1더한걸로 끝
        if(len(n) == 1):
            print(n)
            break

        # 짝수
        # 가운데를 중심으로 뒷부분을 잘라서 더한게 앞부분의 반대가 될수있나 보고, (back이 front 뒤집은것보다 작아야)
        # 안된다면 front에 1 더한걸 뒤집은게 back에 와야
        # front + back 이렇게 자르자
        len_div2 = len(n)//2
        front = n[:len_div2]
        if len(n)%2 == 0:
            back = n[len_div2:]

            # back에 숫자를 더해서 front 뒤집은게 될수 있나?(front 뒤집은것보다 back가 작은가?)
            if int(back) <= int(front[::-1]):
                print(front + front[::-1])
                break
            else:
                # front 1 더했을때 자리수 넘어가는 경우, 그러면 홀수인경우로 넘어가게 된다.
                if len(str(int(front))) != len(str(int(front) + 1)):
                    n = '1' + '0' * len(n)
                    continue
                else: # 자리수 넘어가지 않으면 front에서 1더한걸로 결과 내기
                    front = str(int(front) + 1)
                    print(front + front[::-1])
                    break

        # 홀수
        else:
            back = n[len_div2 + 1:]
            mid = n[len_div2 : len_div2+1]

            # back 에 숫자를 더해서 front 뒤집은게 될수 있나, 중간 한글자 제외
            if int(back) <= int(front[::-1]):
                print(front + mid + front[::-1])
                break
            else:
                # front + mid 더했을때 자리수 넘어가는 경우, 그러면 짝수인경우로 넘어가게 된다.
                if len(str(int(front+mid))) != len(str(int(front+mid) + 1)):
                    n = '1' + '0' * len(n)
                    continue
                else: # 자리수 넘어가지 않으면 mid에서 1더한걸로
                    # 홀수는 mid에 1을 먼저 더하는게 맞다. N보다 큰수증 작은수이므로
                    # 그리고 back은 0으로
                    n = str(int(front + mid) + 1) + '0' * len(back)
                    continue
    return None

sol()
들어온 숫자를 잘라서 뒤집어서 front == back인지 확인하되
들어온 숫자의 자리수가 짝수개인지, 홀수개인지에 따라서 해야 할 일이 달라진다

짝수는 front에 1을 더하면 되고
만약 front에 1을 더할경우 자리올림이 발생시, 원래 숫자보다 한자리 긴 100...00으로 다시 홀수인 경우로 가서 따져보면 된다.

홀수는 mid에 1을 더해야 하고, 짝수일때처럼 그걸 뒤집어서 print 해도 될것 같은데 지금 보니까 코드에 일관성이 없네... back 을 00...00으로 만들고 continue로 다시 큰 while문 돌게 만들었다.
자리수 넘어가는 경우는 원래 숫자보다 한자리 긴 100...00으로 다시 짝수인경우로 넘어가서 따지면 된다.

그리고 문제 예제에서 숫자가 한자리라면 1을 더한걸 출력하면 되고, 처음에 받자마자 1을 더했기때문에 9인 경우에도 문제가 없다.

if int(back) <= int(front[::-1]):
이 부분에 등호가 없다면, 10을 입력받았을때 22가 나오게 된다. 등호 있으면 11이 나온다.



def check(num):
    for i in range(len(str(num))//2):
        while num[i] != num[len(num)-1-i]:
            num = str(int(num)+10**i)
    print(num)

num = input()
check(str(int(num)+1))
?

for문으로 문자열의 인덱스를 잡고 절반만 돌리면서 비교하고
다른부분 인덱스에 10**i 곱해서 더하는식으로 문자열을 바꿔서 맞추는

어쨌든 숫자를 1씩 더하지 말고 문자만 바꿔야 되는것 같다