문제 설명
문자열 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 증가: 그렇지 않다면 시간을 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"를 반환합니다.