문제 링크

문제 요약

이 문제는 시간에 따른 차량의 이동 거리를 추적하는 시뮬레이션입니다. 입력은 표준 입력의 끝(EOF)까지 주어지며, 각 줄은 다음과 같은 두 가지 형태 중 하나입니다.

  1. HH:MM:SS SPEED: 특정 시각(HH:MM:SS)에 차량의 속도(SPEED, 단위: km/h)가 변경됨을 나타냅니다. (예: 00:00:00 100은 0시 0분 0초부터 속도가 100 km/h로 변경됨을 의미)
  2. HH:MM:SS: 특정 시각(HH:MM:SS)까지 차량이 총 얼마의 거리를 이동했는지 조회하는 쿼리입니다.

차량은 0시 0분 0초부터 0 km/h의 속도로 시작하며, 입력되는 속도 변경은 해당 시점부터 적용됩니다. 각 조회 요청에 대해 해당 시점까지의 총 이동 거리를 계산하여 소수점 둘째 자리까지 “HH:MM:SS X.YY km” 형식으로 출력해야 합니다.

풀이

이 문제는 시간에 따른 속도 변화를 기록하고, 특정 시점에 총 이동 거리를 계산하여 출력하는 Implementation 문제입니다.

  1. 초기 상태 설정

    • distance: 현재까지 누적된 총 이동 거리(km). 초기값은 0.0입니다.
    • last_time: 마지막으로 속도가 업데이트되었던 시각(초 단위). 초기값은 0입니다.
    • current_speed: last_time 이후 현재까지 유지되고 있는 속도(km/초). 입력 속도는 km/h이므로, 이를 3600으로 나누어 km/초 단위로 변환하여 사용합니다. 초기값은 0.0입니다.
  2. 입력 처리 루프

    • 표준 입력으로부터 한 줄씩 읽어들이며, 파일의 끝(EOF)에 도달하면 종료합니다.
  3. 쿼리 처리

    • 속도 변경 쿼리 (HH:MM:SS SPEED):

      • 특수 처리 (if last_time == 0): 만약 last_time이 0인 상태(즉, 프로그램 시작 후 첫 번째 속도 설정인 경우)라면, 아직 이전 이동 거리가 없으므로 distance에 아무것도 더하지 않고 last_timecurrent_speed를 현재 시각과 새로운 속도로 업데이트한 후 다음 입력으로 넘어갑니다.
      • 일반 속도 변경: last_time이 0이 아닌 경우(이전 속도 변경이 있었던 경우), last_time부터 현재 time까지 current_speed로 이동한 거리를 계산하여 distance에 더합니다. 그 후 last_timecurrent_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()
 

연관 페이지

참고 문헌 / 사이트