{차량번호 : [시각배열]
형식으로 딕셔너리를 생성한다.
시각은 오름차순으로 정렬되어있다.
dict = {'0000': ['06:00', '06:34', '18:59'] }
차량 번호가 작은 자동차부터 청구할 주차 요금을 차례대로 정수 배열에 담아서 return해야한다.
따라서, 차량번호가 작은 자동차부터 주차시간과 요금을 계산하고 순서대로 answer 리스트에 넣어 최종결과answer
를 반환한다.
출차하지 않은 자동차 전처리
출차하지 않은 자동차의 경우, 시각배열times
의 길이는 홀수가 된다. (IN, OUT이 한 쌍으로 출차하지 않으면 홀수개가 된다.)
e.g.) ['06:00', '06:34', '18:59']
이 경우, 마지막 출차시간을 23:59
로 간주하므로 배열의 끝에 23:59
을 추가해준다.
e.g.) ['06:00', '06:34', '18:59', '23:59']
주차 시간 계산하기
시각배열times
은 [IN시각1, OUT시각1, IN시각2, OUT시각2...]
으로 이루어져있으므로 차량별 누적 주차시간은 다음과 같이 구할 수 있다.
차량별 누적 주차시간 = (OUT시각1 - IN시각1) + (OUT시각2 - IN시각2) + ...
위에서 구한 차량별 누적 주차시간에 대한 주차시간을 계산하고 그 값을 answer
에 순서대로 추가한다.
import math
def timeToMin(time):
h, m = map(int, time.split(':'))
return h*60 + m
def solution(fees, records):
MAX_TIME = '23:59'
answer = []
dict = {}
# 1. 딕셔너리 만들기 {차량번호 : [시각배열]}
for record in records:
time, carnum, inout = record.split(' ')
if carnum in dict:
dict[carnum].append(time)
else:
dict[carnum] = [time]
carnums = sorted(dict.keys()) #['0000', '1234' ....]
for carnum in carnums:
# 2. 주차시간 계산하기
times = dict[carnum] #['06:00', '06:34', '18:59']
length = len(times)
sum = 0
if length % 2 != 0: #홀수개이면 출차된 내역이 없다는 뜻이므로 '23:59'출차로 간주
times.append(MAX_TIME)
for i in range(0, length, 2):
sum += timeToMin(times[i+1]) - timeToMin(times[i])
# 3. 요금계산
if sum > fees[0]:
fee = fees[1] + math.ceil((sum - fees[0]) / fees[2]) * fees[3]
else:
fee = fees[1]
answer.append(fee)
return answer
1. 주차시간 계산
date time객체로 변환하여 -
연산을 하면 date time객체가 리턴된다. 따라서 다시 분 단위로 바꿔줘야하는 불편함이 있어서 첫번째 방법을 선택했다.
2. 차량의 IN, OUT 시각 데이터 자료구조
차량별 출차 시간을 오름차순으로 정렬하면 당연히 IN, OUT, IN, OUT ... 순서대로 정렬될 수 밖에 없다.
3. 차량번호 순서대로 요금을 배열에 담는 방법
이 문제에서 구하는것은 각 차량번호에 대한 요금이 아니라 차량번호순으로 정렬한 "요금배열"이므로 두번째 방법을 선택했다.