본문 바로가기

Test

코테 후기 -2, 3 번 후기

728x90

# 2번 문제의 제출 테스트 케이스 30 중 6개가 시간 초과가 나와서 붙잡고 있느라 시간을 너무 많이 소모했다.

결국 해결하지 못하고 제출 하고 부랴부랴 3번을 뒤늦게 풀었지만 앞서 말했듯이 2번의 시간 소모 때문에 결국에 제대로 풀지 못했다.

2번에 대해서 해결의 실마리를 찾은 상태지만 제출후 테스트를 못하니까 되는지 안되는지는 모르겠다.

다만 풀지 못했던 3번 문제를 다시 풀어서 풀이를 남기고자 한다.

 

# 3. 문제의 요지는 이렇다 푸쉬 알림을 할 건데 푸시 알림을 할 시간을 "ab:cd" 형태의 문자열로 주어진다

더해서 방해금지 시간도 "22:30~23:40" 의 시간을 n개만큼 주어진다.

이런 상황일때 방해금지를 피해서 푸시 알림을 주는 시간을 출력하는 문제입니다.

*규칙*

  1. 방해금지는 1분에서 ~23시 59분까지 설정 가능합니다. 
  2. 자정을 넘어서 설정 가능합니다.
  3. 여러개의 방해금지 시간이 설정됩니다
  4. 방해금지 시간은 겹쳐지는 게 가능합니다

푸시 알림 시간이  23:34고 방해금지 시간이  "22:30~23:40" 이면

푸시 알림은 23:40으로 밀립니다.

*자정을 넘어서는 시간에 대한 규칙*

"23:40 ~ 01:30"이라는 방해금지 시간이 주어지면, 당연히 24시간을 넘어서 자정을 넘어갔다고 판단하고, 그사이에 푸시 알림 시간이 있다면 다음날 01:30에 알람 시간을 출력해야 합니다.

아래와 같은 상황!

푸쉬알림 시간: "00:00"

방해금지산 모음: ["11:00~01:00", "23:00~13:00"]

00:00에 푸시 알림을 줄려고 합니다 하지만 11:00~01:00에 포함되므로 푸시 알림이 01:00까지 밀립니다.

또 01:00이라는 시간은 23:00 ~ 13:00 안에 포함됩니다. 23:00 >> 24:00 --> 00:00 >> 13:00 이므로

그런데 00:00 >> 13:00 >> 01:00까지 방해금지인데 거기다 다시 23:00!!

즉, 다시 말하면 푸쉬알림을 줄 시간이 없어집니다. 이럴 때는 impossible을 출력합니다.

이런 상황일때 푸시 알림을 줘야 하는 시간을 출력하는 문제입니다.

 

* 풀이 생각 알고리즘 *

  • 0. 자정을 넘어가는게 계산하기 버거워 보입니다. 자정을 넘기는걸 어떻게 구현해야 할까?
  • 0-1. 시간 관련 라이브러리를 써볼까??
  • 0-2. 아닙니다 n % 24를 이용합니다. 24를 넘어가는 상황 즉, 자정을 넘어가면 다시 0부터 시작해서 방해금지를 체크하는 거지요.
  • 1. 그럼 방해금지 시간 대역은 어떻게 구현할까요?
  • 2. 저는 0 ~ 24개의 리스트 구간을 만들어서 각 idx를 시간이라고 생각하고 value 분이라고 생각한 다음 문제를 풀었습니다

먼 개소리야? 하실 테지만 코드를 보시면 이해가 가실 듯합니다.

 


[코드]

 

# 3. 알맞은 푸쉬 알림 정하기
def impossibleChk(hours):
    for i in range(len(hours)):
        if hours[i] == "59":
            continue
        else:
            return False
    return True


def solution(noti_time, do_not_disturb):
    answer = ""
    hours = ["60" for _ in range(24)]

    times = []
    for time in do_not_disturb:
        start, end = time.split("~")

        if start > end:
            start = start
            x, y = end.split(":")
            x = int(x) + 24
            end = str(x) + ":" + str(y)
            times.append([start , end])
        else:
            times.append([start, end])

    print(times)
    for t in times:
        s, e = t
        startidx = int(s[:2])
        startvalue = s[3:]

        endidx = int(e[:2])
        endvalue = e[3:]

        for scope in range(startidx, endidx + 1):
            if scope == startidx and hours[scope % 24] == '60':
                hours[scope % 24] = str(startvalue)
            elif scope == endidx and hours[scope % 24] == '60':
                hours[scope % 24] = str(endvalue)
            else:
                hours[scope % 24] = str(59)

    print(hours)
    # 푸쉬 알림이 불가능한 상황
    if impossibleChk(hours):
        return("impossible")

    pushidx = int(noti_time[:2])
    pushtime = noti_time[3:]
    # 해당 시간 그냥 푸쉬알림 하면 되는 상황
    if hours[pushidx] >= pushtime:
        answer = str(pushidx % 24) + ":" + str(pushtime)
        return answer

    # 방해금지 때문에 푸쉬알림이 밀리는 상황
    for idx in range(pushidx + 1, (len(hours) + 24)):
        # print(idx % 24, hours[idx % 24], startidx)
        if hours[idx % 24] != '59':
            answer = str(idx % 24) + ":" + str(hours[idx % 24])
            break
    return answer


nott1 = "23:00"
donot1 = ["22:30~23:40", "23:05~00:45"]  # "00:45"
nott2 = "00:00"
donot2 = ["11:00~01:00", "23:00~13:00"]  # "14:01"
nott3 = "09:55"
donot3 = ["09:55~13:25", "13:25~14:01"]  # "impossible"
nott4 = "09:55"
donot4 = ["13:25~14:01", "09:56~13:25", "20:08~20:15"]  # "09:55"
nott5 = "23:59"
donot5 = ["00:00~23:59", "11:35~23:59"]  # "23:59"

# ["00:00~23:59", "11:35~23:59"]
print(solution(nott5, donot5))

후기

 

주어졌던 테스트 케이스로만 체크할 수 없기 때문에 문제가 완벽하게 풀렸는지는 모릅니다.

다만 제가 시간이 없어 막 제출한 풀이보다는 정확하고, 설령 틀리더라도 방향성은 맞기에

시간을 들이면 맞을 수 있다고 봅니다.

틀리는 부분이 시간 초과 같은 효율성 체크가 아니라면요.

728x90