LeetCode 알고리즘 : Latest Time by Replacing Hidden Digits

TK·2021년 1월 28일
2
post-thumbnail

https://leetcode.com/problems/latest-time-by-replacing-hidden-digits/

1736. 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:

  • time is in the format hh:mm.
  • It is guaranteed that you can produce a valid time from the given string.

풀이):

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 else 문을 한줄에 써서 훨씬 가독성이 좋고
  • for 문 안에서 if time[i] == '?':로 몇 번째 숫자인지 일일히 다 if 조건문에 넣을 필요가 없고
  • 마지막 return 값으로 리스트를 .join() 메소드로 합쳐버리기 때문에 내가 작성했던 max_hour + ':' + max_min 보다 더 깔끔하다.

앞으로 코드를 더 깔끔하게 짜는데 신경을 많이 써야겠다.

profile
Backend Developer

0개의 댓글