ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 4096. [Python]팰린드로미터
    Python_알고리즘/Silver V 2023. 4. 26. 21:03

    1. 문제

     

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

     

    4096번: 팰린드로미터

    입력은 여러 테스트 케이스로 이루어져 있다. 각 테스트 케이스는 한 줄로 이루어져 있고, 현재 승환이의 주행 거리계에 적혀있는 수가 주어진다.이 숫자는 2자리와 9자리 사이(포함)이다. 예를

    www.acmicpc.net

     

    2. 접근 방법

     

    • 시간 제한: 1초
    • 메모리 제한: 128MB
    • 브루트포스

     

    3. 파이썬 코드

     

    while True:
        num = input()
        # input 값이 0 이면 반복문 탈출
        if num == "0":
            break
        else:
            # 몇번 더했는지 확인하는 변수
            cnt = 0
            # 초기의 길이를 체크
            num_length = len(num)
            # 1씩 계속 더해나감
            while True:
                # 앞뒤가 같은지 확인
                if num[::] == num[::-1]:
                    # 같으면 몇번 더했는지 출력
                    print(cnt)
                    break
                # 아닐경우
                else:
                    # 이전의 값에 1을 계속 더해나감
                    num = str(int(num) + 1)
                    # 만약 길이가 처음 길이보다 작아졌을 경우 앞에 0을 차이만큼 추가해줌
                    if len(num) < num_length:
                        num = num[::-1]
                        num += "0"*(num_length-len(num))
                        num = num[::-1]
                cnt += 1

     

    4. 문제를 풀고난 후 생각

     

    • 문제에 적힌 내용 그대로 구현을 진행한다고 굉장히 많은 시도를 했었다.

    • 한 3일정도 잡고 풀었던 것 같지만 오늘 해결했는데 해결방법은 단순했다.
    • 들어온 숫자부터 1씩더해나가며 앞이랑 뒤가 같은지 확인해본 후 같으면 몇번 횟수를 진행했는지를 출력해준 후 무한루프를 탈출하는 것이다.
    • 되게 간단한 문제지만 있는 그대로 구현을 할려고 시도를 하다보니 길이가 1900자 정도로 매우 길어진 느낌이다.
    • str 에서 int 로 변경할 경우 주의할 점은 "000121"등이 올 경우 int 형으로 변하면 121이 되므로 초기 문자의 값의 길이를 체크해둔 후 int로 변하고 다시 str로 변환하는 과정에서 길이를 확인한 후 그 차이만큼 앞에 "0"을 더해주는 식으로 구현했다.
    • 무작정 1씩 더해나가는 것은 시간초과가 나지 않을까? 라는 생각도 해봤지만 예를 들어 값이 "1,000,000"이 올 경우 결국 1씩 더해나가도 대략 1,000,000 ** 0.5 정도의 연산만 시행해도 답이 나올 것 같아서 구현해 봤더니 맞았다.
    • 처음 시도했던 코드랑 새로 짠 코드를 비교해봐도 스스로가 어리석었다.
    더보기
    while True:
        num = input()
        if num == "0":
            break
        else:
            num_length = len(num)
            if num_length % 2 == 0:
                meter = num[:num_length//2]
                meter = meter[::-1]
                need = num[num_length//2:]
                meter_length = len(meter)
                if int(meter) > int(need):
                    print(int(meter)-int(need))
                elif int(meter) == int(need):
                    print(0)
                else:
                    meter = meter[::-1]
                    meter = str(int(meter)+1)
                    meter = meter[::-1]
                    answer_number = 10**meter_length
                    answer = answer_number - int(need)
                    if len(meter) < meter_length:
                        meter = meter[::-1]
                        meter += "0"*(meter_length-len(meter))
                    answer += int(meter)
                    print(answer)
            else:
                meter = num[:num_length//2]
                middle = num[num_length//2]
                meter = meter[::-1]
                need = num[(num_length//2)+1:]
                meter_length = len(meter)
                if int(meter) > int(need):
                    print(int(meter)-int(need))
                elif int(meter) == int(need):
                    print(0)
                else:
                    if middle == "9":
                        meter = meter[::-1]
                        meter = str(int(meter)+1)
                        meter = meter[::-1]
                        if len(meter) < meter_length:
                            meter += "0"
                        print((10**meter_length)-int(need)+int(meter))
                    else:
                        answer_number = 10**meter_length
                        answer = answer_number - int(need)
                        if len(meter) < meter_length:
                            meter = meter[::-1]
                            meter += "0"*(meter_length-len(meter))
                        answer += int(meter)
                        print(answer)

     

     

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

     

    • 브루트 포스
    • 구현

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

    2828. [Python]사과 담기 게임  (0) 2023.07.13
    10826. [Python]피보나치 수 4  (0) 2023.05.17
    1769. [Python]3의 배수  (0) 2023.04.26
    2822. [Python]점수 계산  (0) 2023.04.08
    9625. [Python]BABBA  (0) 2023.04.05

    댓글

Designed by Tistory.