Python_알고리즘/Gold V

1334. [Python]다음 팰린드롬

최근영 2023. 9. 17. 16:19

1. 문제

 

https://www.acmicpc.net/problem/1334

 

1334번: 다음 팰린드롬 수

팰린드롬 수는 앞으로 읽어도, 뒤로 읽어도 같은 숫자이다. 101, 4, 6666와 같은 숫자는 팰린드롬 수이고, 10, 564, 15452와 같은 숫자는 아니다. 어떤 수 N이 주어질 때, N보다 큰 팰린드롬 수 중에서 가

www.acmicpc.net

 

2. 접근 방법

 

  • 시간 제한: 2초
  • 메모리 제한: 128MB
  • 구현

 

3. 파이썬 코드

 

N = input()

N = str(int(N) + 1)
# N의 길이 변수에 저장
N_length = len(N)
# N을 슬라이싱해서 변수에 저장할 변수
ans = ""
# N의 길이가 짝수인 경우와 홀수인 경우
if len(N) % 2 == 0:
    # 중앙값과 중앙값 이후의 값이 대칭이면 N 출력
    if N[:N_length//2] == N[N_length:N_length//2-1:-1]:
        print(N)
    # 외의 경우
    else:
        # ans 라는 값에 12 / 21 이런 형식으로 값을 저장
        ans = N[:N_length//2] + N[:N_length//2][::-1]
        # 인트로 변환한 값이 N보다 클 경우 ans 출력
        if int(ans) >= int(N):
            print(ans)
        # 작을 경우
        else:
            # 가운데 값이 9 인 경우
            if N[N_length//2] == "9":
                # 가운데 값에 맞는 10**제곱값을 더해준 후
                N = str(int(N) + 10**(N_length//2))
                # N의 길이가 짝 => 홀로 바뀐 경우
                if len(N) > N_length:
                    # N 의 가운데 값 기준으로 대칭으로 만든 후 출력
                    N = N[:N_length//2+1] + N[:N_length//2][::-1]
                    print(N)
                # 변하지 않았을 경우 앞뒤 대칭으로 만든 값 출력
                else:
                    print(N[:N_length//2]+N[:N_length//2][::-1])
            # 가운데 값이 9가 아닌 경우
            else:
                # N의 가운데값 +1 한 후 대칭된 값 출력
                ans = str(int(ans) + 10**(N_length//2))
                print(ans[:N_length//2]+ans[:N_length//2][::-1])
# 홀수인 경우
else:
    # 앞뒤 대칭이면 바로 출력
    if N[:N_length//2] == N[N_length//2+1:N_length//2-1:-1]:
        print(N)
    # 대칭이 아닐 경우
    else:
        # ans 에 대칭되게 값을 넣은 후
        ans = N[:N_length//2+1] + N[:N_length//2][::-1]
        # ans 와 N의 크기를 비교해 ans 값이 더 큰 경우 ans 바로 출력
        if int(ans) >= int(N):
            print(ans)
        # ans 값이 더 작은 경우
        else:
            # 만약 중앙값이 9 인 경우
            if N[N_length//2] == "9":
                # N의 값에 중앙값 +1 해준 값 저장
                N = str(int(N) + 10**(N_length//2))
                # 더한 N 값이 홀 => 짝이 된 경우
                if len(N) > N_length:
                    # 대칭되게 값 저장 후 출력
                    N = N[:N_length//2] + N[:N_length//2][::-1]
                    print(N)
                # 외의 경우 대칭되게 값출력
                else:
                    print(N[:N_length//2+1]+N[:N_length//2][::-1])
            # 9가 아닌 경우 가운데 값 +1 한 후 대칭되게 출력
            else:
                print(int(ans) + 10**(N_length//2))

 

4. 문제를 풀고난 후 생각

 

  • 팰린드롬의 조건을 하나하나 체크해주며 조건을 여러 분기로 나눠서 설정했다.
  • 홀, 짝 의 경우 팰린드롬의 조건이 다르기 떄문에 나눠주었고, 각각 중앙값이 9 인 경우와 중앙값을 기준으로 팰린드롬으로 만들었을때 크기를 비교하여 어느 큰지 작은지 등 조건식을 세세히 나눠서 직접 구현했다.
  • 별도의 알고리즘을 사용하진 않았고 조건식을 생각하며 예외경우를 직접 제거해주는 방식으로 구현해서 별도의 설명이 필요없이 코드에 주석단 것을 통해서 이해를 할 수 있을 것이다.

 

5. 문제를 푸는데 도움이 되는 지식

 

  • 구현