bong-u/til

프로그래머스 - 주차 요금 계산 (L2)

수정일 : 2023-08-11

 1import math
 2
 3def diff(start, end):
 4    sh, sm = map(int, start.split(':'))
 5    eh, em = map(int, end.split(':'))
 6    
 7    return (eh*60+em) - (sh*60+sm)
 8
 9def calc(time, baseTime, baseFee, unitTime, unitFee):
10    if time < baseTime:
11        return baseFee
12    time -= baseTime
13    return baseFee + math.ceil(time/unitTime)*unitFee
14    
15def solution(fees, records):
16    cars = {}
17    for i in records:
18        time, car_num, _ = i.split(' ')
19        # 새로 입차 한 경우
20        if not car_num in cars:
21            cars[car_num] = [0, time]
22        else:
23            # 출차 후 다시 입차한 경우
24            if cars[car_num][1] == '':
25                cars[car_num][1] = time
26            # 출차한 경우
27            else:
28                cars[car_num][0] += diff(cars[car_num][1], time)
29                cars[car_num][1] = ''
30    
31    # 아직 출차하지 않은 차량들에 대해 23:59에 출차한 것으로 간주
32    for num in cars:
33        if cars[num][1] != '':
34            cars[num][0] += diff(cars[num][1], '23:59')
35            cars[num][1] = ''
36    
37    # 요금 계산
38    for num in cars:
39        cars[num] = calc(cars[num][0], fees[0], fees[1], fees[2], fees[3])
40    
41    # 차량 번호 순으로 정렬
42    sorted_keys = sorted(cars.keys())
43    # 요금만 추출해서 반환
44    return [cars[key] for key in sorted_keys]

문제

  • 기본 시간, 기본 요금, 단위 시간, 단위 요금
  • 차량의 입출차 기록 (시각(HH:MM), 차량번호(XXXX), 내역(입차/출차))
  • 위 정보가 주어질때, 각 차량별 주차 요금을 계산해서 차량번호 순으로 정렬하여 반환하라
  • 입차만 하고 출차하지 않은 차량은, 23:59에 출차한 것으로 간주한다
  • TC
    • input

      fees: [180, 5000, 10, 600]
      records: [“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”]

    • ouput

      [14600, 34400, 5000]

해결방법

  • cars라는 dictionary에 차량번호를 key로, [주차시간, 입차시간]을 value로 저장한다
  • 마지막에 한번에 요금을 계산한다