본문 바로가기

취업을 준비하며 정리하는 컴퓨터 지식/Problem Solving

[Problem Solving] 프로그래머스 92341 주차 요금 계산

728x90

주차 요금 계산에 대한 문제 설명은 다음의 링크를 참고해주시기 바랍니다. 문제 설명

 

코딩테스트 연습 - 주차 요금 계산

[180, 5000, 10, 600] ["05:34 5961 IN", "06:00 0000 IN", "06:34 0000 OUT", "07:59 5961 OUT", "07:59 0148 IN", "18:59 0000 IN", "19:09 0148 OUT", "22:59 5961 IN", "23:00 5961 OUT"] [14600, 34400, 5000]

programmers.co.kr

 

시간 순서로 저장되어 있는 차량 입출차 기록을 기준으로 차량 번호를 기준으로 정렬된 주차 요금 내역을 결과로 반환하는 문제입니다. 유의해야 할 사항은 다음과 같습니다.

  • 임의의 차량이 입차된 기록만 있고, 출차된 기록이 없다면 23:59에 출차된 것으로 간주한다.
  • 기본 시간을 초과한 차량에 대해서 단위 시간 요금을 청구할 때 (주차 시간 / 단위 시간)의 값이 소수일 경우 올림 한다.

다음은 문제 해결 순서입니다.

  1. record를 공백을 기준으로 분리한다.
  2. car_id를 key로 check_time을 value로 car_dict에 저장한다.
  3. car_dict를 순환하며 이때의 value 배열의 길이가 2보다 작은지 확인한다.
  4. 3의 결과가 참이라면 in_time = value.pop(0), out_time = "23:59"로 설정한다.
  5. 3의 결과가 거짓이라면 in_time, out_time을 모두 value.pop(0)으로 설정한다.
  6. in_time과 out_time을 기준으로 주차 요금을 계산하여 answer_dict에 주차 요금을 저장한다.
  7. answer_dict을 정렬하여 순환하며 주차 요금만 결과로 반환해준다.

다음은 해결 순서를 기준으로 작성한 코드입니다.

 

import math
import datetime

def sub_time(in_time: str, out_time: str) -> int:
  time_format = "%H:%M"
  in_time = datetime.datetime.strptime(in_time, time_format)
  out_time = datetime.datetime.strptime(out_time, time_format)
  return (out_time - in_time).seconds // 60

def calc_fees(value: int, fees: list) -> int:
  if value <= fees[0]:
    return fees[1]
  else:
    return int(fees[1] + math.ceil((value - fees[0]) / fees[2]) * fees[3])

def get_calc_fees_by(values: list, fees: list) -> int:
  minute = 0
  while values:
    out_time = "23:59"
    in_time = values.pop(0)
    if values:
      out_time = values.pop(0)
    minute += sub_time(in_time, out_time)
  return calc_fees(minute, fees)

def solution(fees: list, records: list) -> list:
  answer_dict = {}
  car_dict = {}
  records = [record.split() for record in records]

  for check_time, car_id, _ in records:
    if car_id in car_dict:
      car_dict[car_id].append(check_time)
    else:
      answer_dict[car_id] = 0
      car_dict[car_id] = []

  for key, values in car_dict.items():
    answer_dict[key] = get_calc_fees_by(values, fees)
  
  return [item[-1] for item in sorted(answer_dict.items())]

 

다음은 코드에 구현된 함수들에 대한 설명입니다.

  • sub_time: in_time과 out_time이 주어지면 두 값의 차를 분으로 반환한다.
  • calc_fees: value와 fees를 사용하여 차량의 주차 요금을 계산하여 반환한다.
  • get_calc_fees_by: 임의의 차량의 모든 주차 시간 values를 순환하며 주차 시간을 모두 계산한 후에 calc_fees를 호출하여 주차 요금을 반환한다.

문제를 해결한 후 다시 한번 문제를 확인해보니 sub_time처럼 시간을 기준으로 계산하지 않고 분을 기준으로 계산하면 조금 더 깔끔한 코드를 얻을 수 있을 것 같습니다. 또한 차량 번호가 0000~9999까지로 제한이 되니 딕셔너리가 아닌 배열을 사용하면 record 값을 순환하며 바로바로 주차 시간을 계산할 수 있을 것 같습니다.

728x90