문자열 시간을 숫자로 변환한다.
문자열로 되어있는 시간을 보고 가장 먼저 들어야 하는 생각은, 문자열의 시간을 숫자로 변환하는 것이어야 한다. 문자열 간 시간을 비교할 수 없으므로, 숫자로 변환하여 누적 분을 저장해 둔다면, 시간을 빼거나 비교하는 데 있어서 매우 편하기 때문이다.
# 문자열 시간을 포맷팅하는 코드
def get_time(time):
s_hours, s_minutes = time.split(":")
return int(s_hours) * 60 + int(s_minutes)
시간을 누적하여 저장한다.
시간을 저장하는 공간을 만든 뒤, records
를 순회하며 시간을 누적시킨다. 이 때, 주의해야 할 점은, 들어오는 기록은 항상 존재하지만, 나가는 기록은 존재하지 않을 수 있다. 이를 어떻게 처리해야 하나 처음에는 고민을 했다.
그런데 문제의 조건에 들어오는 시간에 나가는 차량의 경우는 없다고 했으므로, 해당 경우를 이용하였다.
OUT일 경우 초기화 했기 때문에 두 시간이 같을 것이고, 만약 OUT 기록이 없다면 IN과 OUT의 시간이 다를 것이기 때문에, records
를 모두 순회한 뒤 data 딕셔너리의 키를 순회하여 들어오는 시간과 나가는 시간이 다를 경우에 23:59분에서 들어오는 시간을 뺀 값을 누적시간에 더한다.
요금을 구한다.
요금을 구하는 공식은 간단하다. 기본 요금 + (누적 시간 - 기본 시간 [0보다 작다면 0]) / 단위 시간의 올림 값 * 요금이다.
def get_charge(fees, diff):
basic_time, basic_charge, unit_time, unit_charge = fees
return (
basic_charge
+ int(
math.ceil((diff - basic_time if diff - basic_time > 0 else 0) / unit_time)
)
* unit_charge
)
문제에 맞게 데이터를 정렬하고 가공한다.
나머지는 코드로 확인하자.
import math
def solution(fees, records):
answer = []
data = {}
cumulative_time = {}
last_time = get_time("23:59")
for record in records:
time, car, status = record.split(" ")
if car not in data.keys():
data[car] = [last_time, last_time]
if status == "IN":
data[car][0] = get_time(time)
elif status == "OUT":
data[car][1] = get_time(time)
cumulative_time[car] = (
cumulative_time.get(car, 0) + data[car][1] - data[car][0]
)
data[car] = [last_time, last_time]
for key in data.keys():
cumulative_time[key] = cumulative_time.get(key, 0) + data[key][1] - data[key][0]
for item in cumulative_time.items():
key, value = item
answer.append((key, get_charge(fees, value)))
# 데이터를 정렬하고 가공한다.
return list(map(lambda x: x[1], sorted(answer, key=lambda x: x[0])))
def get_time(time):
s_hours, s_minutes = time.split(":")
return int(s_hours) * 60 + int(s_minutes)
def get_charge(fees, diff):
basic_time, basic_charge, unit_time, unit_charge = fees
return (
basic_charge
+ int(
math.ceil((diff - basic_time if diff - basic_time > 0 else 0) / unit_time)
)
* unit_charge
)
아주 어려운 문제는 아니었지만, 중간 중간 까다로운 부분이 있었다.