🪴 Hayul's digital garden

Search

Search IconIcon to open search

주차 요금 계산

Last updated Dec 14, 2022 Edit Source

주차장의 요금표와 차량이 들어오고(입차) 나간(출차) 기록이 주어졌을 때, 차량별로 주차 요금을 계산하려고 합니다. 아래는 하나의 예시를 나타냅니다.

기본 시간(분)기본 요금(원)단위 시간(분)단위 요금(원)
180500010600
시각(시:분)차량 번호내역
05:345961입차
06:000000입차
06:340000출차
07:595961출차
07:590148입차
18:590000입차
19:090148출차
22:595961입차
23:005961출차
차량 번호누적 주차 시간(분)주차 요금(원)
000034 + 300 = 3345000 + (334 - 180) / 10 x 600 = 14600
01486705000 +(670 - 180) / 10x 600 = 34400
5961145 + 1 = 1465000

주차 요금을 나타내는 정수 배열 fees, 자동차의 입/출차 내역을 나타내는 문자열 배열 records가 매개변수로 주어집니다. 차량 번호가 작은 자동차부터 청구할 주차 요금을 차례대로 정수 배열에 담아서 return 하도록 solution 함수를 완성해주세요.

# 제한사항


# 입출력 예

feesrecordsresult
[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]
[120, 0, 60, 591]["16:00 3961 IN","16:00 0202 IN","18:00 3961 OUT","18:00 0202 OUT","23:58 3961 IN"][0, 591]
[1, 461, 1, 10]["00:00 1234 IN"][14841]

# 나의 풀이

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
import math
import datetime

def solution(fees, records):
    answer = []
    ht = {}
    for i in records:
        temp = i.split()
        if temp[1] not in ht:
            ht[temp[1]] = [temp[0]]
        else:
            ht[temp[1]].append(temp[0])

    for i in ht:
        if len(ht[i]) % 2 == 1:
            ht[i].append("23:59")

    temp = sorted([i for i in ht])
    new_ht = {}
    for i in temp:
        new_ht[i] = ht[i]

    for i in new_ht:
        total_fees = 0
        total_minutes = 0

        for j in range(len(new_ht[i])//2):

            out_time = new_ht[i][2*j + 1].split(':')
            out_time = datetime.timedelta(
            hours = int(out_time[0]), 
            minutes = int(out_time[1]))

            in_time = new_ht[i][2*j].split(':')
            in_time = datetime.timedelta(
            hours = int(in_time[0]), 
            minutes = int(in_time[1]))

            minutes = ((out_time - in_time).seconds)/60
            total_minutes += minutes

        total_fees = fees[0] - total_minutes

        if total_fees >= 0:
            answer.append(fees[1])
        else:
            answer.append(fees[1] 
            + math.ceil(
            (abs(total_fees) / fees[2])
            ) * fees[3])

    return answer

Note

이 문제는 재미있다. 풀이는 크게 세 부분으로 구성된다.

  1. records 리스트를 받아서 차 번호를 key로, 입출 시간들을 value로 갖는 ht 딕셔너리에 저장한다.
  2. (출제자가 일부로 꼰 것 같지만) 차 번호가 낮은 순서대로 출력하기 위해서 ht를 정렬한 new_ht를 만든다. 이후 new_ht에서 각 차 번호(key)를 순회하며 입출 시간을 분 단위로 계산하여 저장한다.
  3. 누적된 주차 시간(total_minutes)을 기본 시간과 비교하며(total_fees) 기본 시간보다 더 클 경우, 단위 시간마다 단위 요금을 더해 answer에 저장해준다.