ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 1334. [Python]다음 팰린드롬
    Python_알고리즘/Gold V 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. 문제를 푸는데 도움이 되는 지식

     

    • 구현

    'Python_알고리즘 > Gold V' 카테고리의 다른 글

    15686. [Python]치킨 배달  (0) 2023.09.22
    7576. [Python]토마토  (0) 2023.09.17
    1038. [Python]감소하는 수  (0) 2023.09.08
    1083. [Python]소트  (0) 2023.09.07
    5430. [Python]AC  (0) 2023.08.08

    댓글

Designed by Tistory.