문제 링크
문제 요약
주어진 시간에 통합 센터에 도착한 한 사람이 여러 창구를 정해진 순서대로 방문하여 여권을 발급받으려고 합니다. 모든 창구를 순서대로 방문하여 여권을 발급받을 수 있는지 판단하고, 가능하다면 가장 빨리 발급받을 수 있는 시간을 hh:mm
형식으로 출력하고, 불가능하다면 “No”를 출력하는 문제입니다.
- 각 창구의 개장 시간, 폐장 시간, 그리고 서비스 소요 시간이 주어집니다.
- 창구 간 이동 시간이 없습니다.
- 서비스는 해당 창구가 폐장하기 전에 반드시 완료되어야 합니다.
풀이
- 이 문제는 시간 유형 문제을
분(minute)
단위로 통일하여 계산하면 편하게 풀이할 수 있습니다.hh:mm
형식의 시간을00:00
부터의 총 분으로 변환하는 헬퍼 함수를 구현하면 계산을 단순화할 수 있습니다. 예를 들어,08:00
은8 * 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")