https://programmers.co.kr/learn/courses/30/lessons/92341?language=python3
주차장의 요금표와 차량이 들어오고(입차) 나간(출차) 기록이 주어졌을 때, 차량별로 주차 요금을 계산하려고 합니다. 아래는 하나의 예시를 나타냅니다.
기본 시간(분) | 기본 요금(원) | 단위 시간(분) | 단위 요금(원) |
---|---|---|---|
180 | 5000 | 10 | 600 |
시각 (시:분) | 차량 번호 | 내역 |
---|---|---|
05:34 | 5961 | 입차 |
06:00 | 0000 | 입차 |
06:34 | 0000 | 출차 |
07:59 | 5961 | 출차 |
07:59 | 0148 | 입차 |
18:59 | 0000 | 입차 |
19:09 | 0148 | 출차 |
22:59 | 5961 | 입차 |
23:00 | 5961 | 출차 |
차량 번호 | 누적 주차 시간(분) | 주차 요금(원) |
---|---|---|
0000 | 34 + 300 = 334 | 5000 + ⌈(334 - 180) / 10⌉ x 600 = 14600 |
0148 | 670 | 5000 +⌈(670 - 180) / 10⌉ x 600 = 34400 |
5961 | 145 + 1 = 146 | 5000 |
주차 요금을 나타내는 정수 배열 fees, 자동차의 입/출차 내역을 나타내는 문자열 배열 records가 매개변수로 주어집니다. 차량 번호가 작은 자동차부터 청구할 주차 요금을 차례대로 정수 배열에 담아서 return 하도록 solution 함수를 완성해주세요.
from math import ceil
def to_minutes(time):
h, m = map(int, time.split(':'))
return h*60 + m
def solution(fees, records):
recs = {}
fee = {}
for record in records:
time, num, io = record.split()
if num in recs:
recs[num].append([time, io])
else:
recs[num] = [[time, io]]
for rec in recs:
total = 0
payment = fees[1]
if len(recs[rec]) % 2 != 0:
recs[rec].append(["23:59", "OUT"])
for r in recs[rec]:
if r[1] == "IN":
total -= to_minutes(r[0])
else:
total += to_minutes(r[0])
if total > fees[0]:
payment += ceil((total - fees[0]) / fees[2]) * fees[3]
fee[rec] = payment
fee = sorted(fee.items())
return [f for n, f in fee]
우선 주차 요금은 분 단위로 내므로 계산을 조금 간단하게 하기 위해 "HH:MM" 형태의 문자열로 되어있는 입차 시간과 출차 시간을 모두 분으로 바꿔주는 함수를 만든다
def to_minutes(time):
h, m = map(int, time.split(':'))
return h*60 + m
그리고 recs라는 딕셔너리를 만들어 주어진 records 안에 있는 모든 입출차 기록을 차량 번호 별로 묶어주어
{car_num: \[입출차 기록, IN/OUT]}
형태로 만들어 준다.
for record in records:
time, num, io = record.split()
if num in recs:
recs[num].append([time, io])
else:
recs[num] = [[time, io]]
이제 만들어진 recs를 돌면서 입출차 기록에 따라 차량들이 지불해야 하는 총 금액을 계산한다. 총 시간인 total은 0으로, payment는 기본요금으로 설정해둔다.
for rec in recs:
total = 0
payment = fees[1]
그런데 입차 기록만 있고 출차한 기록이 없는 차량은 23:59에 출차한 것으로 간주하므로 입출차 기록의 길이가 홀수면 ["23:59", "OUT"]
이라는 기록을 하나 추가해준다.
if len(recs[rec]) % 2 != 0:
recs[rec].append(["23:59", "OUT"])
차량별 입출차 기록을 돌면서 기록이 IN이면 total에서 시간을 마이너스
하고 OUT이면 더해
준다. (총 시간 = 출차기록 - 입차 기록)
for r in recs[rec]:
if r[1] == "IN":
total -= to_minutes(r[0])
else:
total += to_minutes(r[0])
total이 기본 시간보다 작으면 따로 더할 게 없으므로 넘기고, 기본요금보다 크다면 (total - 기본요금) / 단위 시간
을 올림한 값에 단위 요금
을 곱한 값을 total에 더해준다. 그리고 계산한 금액을 fee 딕셔너리에 차량 번호에 맞춰 넣는다.
if total > fees[0]:
payment += ceil((total - fees[0]) / fees[2]) * fees[3]
fee[rec] = payment
fee를 차량 번호 기준 오름차순으로 정렬한 후 지불해야하는 금액만 리스트에 넣어 리턴한다.
fee = sorted(fee.items())
return [f for n, f in fee]