https://leetcode.com/problems/latest-time-by-replacing-hidden-digits/
문제)
You are given a string time
in the form of hh:mm
, where some of the digits in the string are hidden (represented by ?
).
The valid times are those inclusively between 00:00
and 23:59
.
Return the latest valid time
you can get from time by replacing the hidden digits.
Example 1:
Output: "23:50" Explanation: The latest hour beginning with the digit '2' is 23 and the latest minute ending with the digit '0' is 50.
Example 2:
Output: "09:39"
Example 3:
Output: "19:22"
Constraints:
풀이):
class Solution:
def maximumTime(self, time: str) -> str:
hidden_hour = time[0:2]
hidden_min = time[3:]
if hidden_hour[0] == '?':
if hidden_hour[1] == '?':
max_hour = '23'
elif int(hidden_hour[1]) > 3:
max_hour = '1' + hidden_hour[1]
else:
max_hour = '2' + hidden_hour[1]
elif hidden_hour[1] == '?':
if int(hidden_hour[0]) == 2:
max_hour = '23'
else:
max_hour = hidden_hour[0] + '9'
else:
max_hour = hidden_hour[0] + hidden_hour[1]
if hidden_min[0] == '?':
if hidden_min[1] == '?':
max_min = '59'
else:
max_min = '5' + hidden_min[1]
elif hidden_min[1] == '?':
max_min = hidden_min[0] + '9'
else:
max_min = hidden_min[0] + hidden_min[1]
return max_hour + ':' + max_min
답을 구하기 위해서는 경우의 수를 따져보아야 한다.
시간이 최대가 되기 위해서는 이미 정해진 부분의 숫자를 살펴보아야 한다.
시간(hour) : 10의 자리 수 부분이 0, 1, 2 인경우와 1의 자리 수가 4 이상, 미만인 경우를 분리해서 조건문을 작성
분(min) : 10의 자리 수와 1의 자리 수의 값과 상관없이 10의 자리수는 5로 맞추고, 1의 자리 수는 9로 맞추면 됨
만약 ?
없이 값이 이미 주어진 상태라면 그대로 출력하면 된다.
시간과 분의 자리에 ??
두개가 연속으로 오면, 각각 23과 59를 출력하도록 하면 된다.
위 방식은 처음 생각한대로 푼 코드이고, 뭔가 더 깔끔한 방법이 없을까 LeetCode 답안을 찾아보던 중 문제를 푸는 로직은 비슷하지만 훨씬 깔끔한 코드를 발견했다.
내가 생각하는 모범답안):
class Solution:
def maximumTime(self, time: str) -> str:
time = list(time)
for i in range(len(time)):
if time[i] == "?":
if i == 0: time[i] = "2" if time[i+1] in "?0123" else "1"
elif i == 1: time[i] = "3" if time[0] == "2" else "9"
elif i == 3: time[i] = "5"
else: time[i] = "9"
return "".join(time)
if time[i] == '?':
로 몇 번째 숫자인지 일일히 다 if 조건문에 넣을 필요가 없고.join()
메소드로 합쳐버리기 때문에 내가 작성했던 max_hour + ':' + max_min
보다 더 깔끔하다. 앞으로 코드를 더 깔끔하게 짜는데 신경을 많이 써야겠다.