문제 링크
문제 요약
이 문제는 시간에 따른 차량의 이동 거리를 추적하는 시뮬레이션입니다. 입력은 표준 입력의 끝(EOF)까지 주어지며, 각 줄은 다음과 같은 두 가지 형태 중 하나입니다.
HH:MM:SS SPEED
: 특정 시각(HH:MM:SS
)에 차량의 속도(SPEED
, 단위: km/h)가 변경됨을 나타냅니다. (예:00:00:00 100
은 0시 0분 0초부터 속도가 100 km/h로 변경됨을 의미)HH:MM:SS
: 특정 시각(HH:MM:SS
)까지 차량이 총 얼마의 거리를 이동했는지 조회하는 쿼리입니다.
차량은 0시 0분 0초부터 0 km/h의 속도로 시작하며, 입력되는 속도 변경은 해당 시점부터 적용됩니다. 각 조회 요청에 대해 해당 시점까지의 총 이동 거리를 계산하여 소수점 둘째 자리까지 “HH:MM:SS X.YY km” 형식으로 출력해야 합니다.
풀이
이 문제는 시간에 따른 속도 변화를 기록하고, 특정 시점에 총 이동 거리를 계산하여 출력하는 Implementation 문제입니다.
-
초기 상태 설정
distance
: 현재까지 누적된 총 이동 거리(km). 초기값은 0.0입니다.last_time
: 마지막으로 속도가 업데이트되었던 시각(초 단위). 초기값은 0입니다.current_speed
:last_time
이후 현재까지 유지되고 있는 속도(km/초). 입력 속도는 km/h이므로, 이를 3600으로 나누어 km/초 단위로 변환하여 사용합니다. 초기값은 0.0입니다.
-
입력 처리 루프
- 표준 입력으로부터 한 줄씩 읽어들이며, 파일의 끝(EOF)에 도달하면 종료합니다.
-
쿼리 처리
-
속도 변경 쿼리 (
HH:MM:SS SPEED
):- 특수 처리 (
if last_time == 0
): 만약last_time
이 0인 상태(즉, 프로그램 시작 후 첫 번째 속도 설정인 경우)라면, 아직 이전 이동 거리가 없으므로distance
에 아무것도 더하지 않고last_time
과current_speed
를 현재 시각과 새로운 속도로 업데이트한 후 다음 입력으로 넘어갑니다. - 일반 속도 변경:
last_time
이 0이 아닌 경우(이전 속도 변경이 있었던 경우),last_time
부터 현재time
까지current_speed
로 이동한 거리를 계산하여distance
에 더합니다. 그 후last_time
과current_speed
를 현재 시각과 새로운 속도로 업데이트합니다.
- 특수 처리 (
-
거리 조회 쿼리 (
HH:MM:SS
):last_time
부터query_time
까지current_speed
로 이동한 거리를 계산합니다.- 이 거리를
distance
에 더한 값이 해당 시점까지의 총 이동 거리입니다. 이 값을 소수점 둘째 자리까지 포맷하여 출력합니다. - 중요: 거리 조회 쿼리는
distance
,last_time
,current_speed
변수를 업데이트하지 않아야 합니다. 이는 시뮬레이션의 누적 상태에 영향을 주지 않고, 현재까지의 스냅샷을 제공하기 위함입니다.
-
이러한 로직을 통해 각 이벤트에 따라 누적 거리를 계산하고, 조회 요청에 적절히 응답하여 최종 답안을 도출합니다.
정답 코드
def solve():
distance = 0
last_time = 0
current_speed = 0
while 1:
try:
s = input()
except EOFError:
break
if " " in s:
# 속도 변경 쿼리
time, speed = s.split()
time = to_num(time)
speed = int(speed) / 3600
if last_time == 0:
# 첫 쿼리인 경우
# 첫 속도 설정 시에는 이동 거리를 더하지 않고 초기화만 진행
last_time = time
current_speed = speed
continue
# 이전 속도 변경 시점부터 현재 속도 변경 시점까지의 거리 계산
distance += (time - last_time) * current_speed
current_speed = speed
last_time = time
else:
# 현재까지 이동 거리 조회
# last_time부터 조회 시점까지의 거리 포함하여 출력
p(s, f"{distance + (to_num(s) - last_time) * current_speed:.2f} km")
if __name__ == "__main__":
tc = 1
for t in range(1, tc+1):
ret = solve()