문제 링크

문제 요약

주어진 시간에 통합 센터에 도착한 한 사람이 여러 창구를 정해진 순서대로 방문하여 여권을 발급받으려고 합니다. 모든 창구를 순서대로 방문하여 여권을 발급받을 수 있는지 판단하고, 가능하다면 가장 빨리 발급받을 수 있는 시간을 hh:mm 형식으로 출력하고, 불가능하다면 “No”를 출력하는 문제입니다.

  • 각 창구의 개장 시간, 폐장 시간, 그리고 서비스 소요 시간이 주어집니다.
  • 창구 간 이동 시간이 없습니다.
  • 서비스는 해당 창구가 폐장하기 전에 반드시 완료되어야 합니다.

풀이

  • 이 문제는 시간 유형 문제분(minute) 단위로 통일하여 계산하면 편하게 풀이할 수 있습니다.
    • hh:mm 형식의 시간을 00:00부터의 총 분으로 변환하는 헬퍼 함수를 구현하면 계산을 단순화할 수 있습니다. 예를 들어, 08:008 * 60 = 480분으로 변환합니다.
  • 각 창구를 순서대로 돌면서 완료할 수 있는지 Simulation하는 문제입니다.
  • 문제에서 주어지는 조건을 모두 잘 구현하면 해결할 수 있습니다.

정답 코드

def tm_to_num(tm: str) -> int:
  h, m = map(int, tm.split(":"))
  return h * 60 + m
 
def solve():
  current = tm_to_num(input()) # 사람이 통합 센터에 도착하는 시간을 분 단위로 변환
  n  = int(input()) # 방문할 창구의 수
 
  # 각 창구를 순서대로 처리
  for _ in range(n):
    a, b, duration = input().split() # 개장 시간, 폐장 시간, 소요 시간
    a = tm_to_num(a)         # 개장 시간을 분 단위로 변환
    b = tm_to_num(b)         # 폐장 시간을 분 단위로 변환
    duration = int(duration) # 소요 시간을 정수로 변환
 
    # 1. 현재 시간이 창구 폐장 시간보다 같거나 늦으면 서비스 불가
    # 2. 사람이 서비스를 시작할 수 있는 시간 (max(current, a))부터 폐장 시간 (b)까지 남은 시간이 서비스 소요 시간 (duration)보다 짧으면 서비스 불가
    if current < b and b - max(current, a) >= duration:
      # 서비스가 가능하다면, 서비스 종료 시간을 다음 창구로 넘어갈 시간 (현재 시간)으로 갱신
      current = max(current, a) + duration
    else:
      # 서비스가 불가능하다면 "No"를 반환하고 종료
      return (False, -1)
  
  # 모든 창구를 성공적으로 방문했다면 "Yes"와 최종 시간을 반환
  return (True, current)
 
 
if __name__ == "__main__":
  tc = 1
  for t in range(1, tc+1):
    ret = solve()
 
    if ret[0]:
      p("Yes")
      p(f"{ret[1] // 60:02}:{ret[1] % 60:02}")
    else:
      p("No")

연관 페이지

참고 문헌 / 사이트