Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

파이썬으로 주어진 시간 이후의 가장 가까운 회문 시간 찾기

문제 설명

문자열 s가 24시간 형식(HH:MM)의 시간을 나타낸다고 가정해 보겠습니다. 이때 HH(시)는 0~23, MM(분)은 0~59 범위에 속합니다. 우리가 찾아야 하는 것은 문자열로 읽었을 때 회문(palindrome), 즉 거꾸로 읽어도 동일한 시간 중 현재 시간 이후로 가장 가까운 시간입니다. 만약 더 이상 존재하지 않는다면 -1을 반환합니다.

예를 들어 입력이 "22:22"라면 출력은 "23:32"가 됩니다. "23:32"는 거꾸로 읽어도 "23:32"이므로 회문에 해당하기 때문입니다.

풀이 접근 방법

핵심 아이디어는 매우 간단합니다. HH:MM 형태의 시간이 회문이 되려면 분(MM)이 반드시 시(HH)를 뒤집은 값과 일치해야 합니다. 따라서 가능한 후보는 두 가지뿐입니다.

  1. 현재 시간 유지: 현재 분이 뒤집힌 시간 값보다 작다면, 분을 뒤집힌 시간 값으로 맞추면 바로 회문이 됩니다.
  2. 시간 1 증가: 그렇지 않다면 시간을 1 늘리고, 새로운 시간을 뒤집은 값을 분으로 사용합니다.

단, 하루의 마지막 회문 시간은 23:32입니다(23을 뒤집으면 32). 따라서 시가 23이고 분이 32 이상이라면 그날은 더 이상 회문 시간이 없으므로 -1을 반환합니다.

이 문제를 해결하기 위해 다음 단계를 따릅니다 −

  • n := 문자열 s의 길이

  • hour_string := s의 인덱스 0~2에 해당하는 부분 문자열(시 부분)

  • minute := s의 인덱스 3~5에 해당하는 부분 문자열을 정수로 변환한 값

  • rev_hour := hour_string을 뒤집은 뒤 숫자로 변환한 값

  • rev_hr_str := hour_string을 뒤집은 문자열

  • h := hour_string을 정수로 변환한 값

  • temp := 빈 문자열, res := 빈 문자열로 초기화

  • 만약 h가 23이고 minute가 32보다 크거나 같다면

    • res := -1 (하루에 더 이상 회문 시간이 존재하지 않음)

  • 그렇지 않고 minute < rev_hour인 경우

    • h가 10보다 작으면 temp := "0"

    • temp := temp에 h를 이어 붙임

    • rev_hour가 10보다 작으면 res := temp + ":0" + rev_hr_str

    • 그렇지 않으면 res := temp + ":" + rev_hr_str

  • 그 외의 경우

    • h := h + 1

    • rev_hr_str := h를 문자열로 변환한 뒤 뒤집은 값

    • rev_hour := rev_hr_str을 정수로 변환한 값

    • 앞선 경우와 동일한 방식으로 결과 문자열을 구성

  • res 반환

구현 예제

더 나은 이해를 돕기 위해 다음 파이썬 구현을 살펴보겠습니다 −

def get_next_palindrome_time(s):
    n = len(s)
    hour_string = s[0 : 2]
    minute = int(s[3 : 5])
    rev_hour = int(hour_string[::-1])
    rev_hr_str = hour_string[::-1]
    h = int(hour_string)
    temp = ""
    res = ""
    if (h == 23 and minute >= 32):
        res = "-1"
    elif (minute < rev_hour):
        if (h < 10):
            temp = "0"
        temp = temp + str(h)
        if (rev_hour < 10):
            res = res + temp + ":0" + rev_hr_str
        else:
            res = res + temp + ":" + rev_hr_str
    else:
        h += 1
        rev_hr_str = str(h)[::-1]
        rev_hour = int(rev_hr_str)
        if (h < 10):
            temp = "0"
        temp = temp + str(h)
        if (rev_hour < 10):
            res = res + temp + ":0" + rev_hr_str
        else:
            res = res + temp + ":" + rev_hr_str
    return res

s = "22:22"
print(get_next_palindrome_time(s))

입력

"22:22"

출력

23:32

동작 원리 정리

입력이 "22:22"일 때의 흐름을 살펴보겠습니다. 시(hour_string)는 "22", 분(minute)은 22이며, "22"를 뒤집어도 "22"이므로 rev_hour는 22입니다. 현재 분(22)이 rev_hour(22)보다 작지 않기 때문에 시간을 1 증가시켜 23으로 만들고, "23"을 뒤집은 "32"를 분으로 붙여 최종 결과 "23:32"를 반환합니다.