# 코드
import math
def solution(fees, records):
cars_park_time = {}
answer = []
for i in range(len(records)):
[in_time, in_car_number, in_info] = records[i].split(" ")
# 입차 정보를 찾는다
if in_info == "IN":
# 해당 자동차의 출차 시간을 찾는다
out_time = get_out_time(in_car_number,i,records)
park_time = get_park_time(in_time,out_time)
# 자동차의 주차시간을 누적계산한다
if in_car_number in cars_park_time:
cars_park_time[in_car_number] += park_time
else :
cars_park_time[in_car_number] = park_time
# 자동차 번호판 오름차순으로 정렬한다
cars_park_time = sorted(cars_park_time.items())
# 주차요금을 계산하고 답에 추가한다.
for (car_number,park_time) in cars_park_time:
answer.append(get_fee(fees,park_time))
return answer
# 출차 시각을 찾는다. 만약 없으면 "23:59"에 나간것으로 간주한다
def get_out_time(in_car_number,idx,records):
for j in range(idx,len(records)):
[out_time, out_car_number, out_info] = records[j].split(" ")
if in_car_number == out_car_number and out_info == "OUT":
return out_time
return "23:59"
# 주차 시간을 계산한다. 전부 "분"으로 변환후 계산했다.
def get_park_time(in_time,out_time):
return (int(out_time[:2]) * 60 + int(out_time[3:])) - (int(in_time[:2]) * 60 + int(in_time[3:]))
# 주차 요금을 계산한다
def get_fee(fees,park_time):
[base_time,base_fee,per_time,per_fee] = fees
if park_time <= base_time:
return base_fee
else:
return base_fee + math.ceil((park_time-base_time) / per_time) * per_fee
먼저구해야하는 정보는 자동차의 누적 주차시간이다.
이를 위해 dict {}
를 여러 생성해서 각종 정보들을 저장할 수도 있지만, 이중for문을 돌아도 시간복잡도가 크지않은 것 같아 이중for문을 사용했다.
기본적인 풀이 전략은 다음과 같다.
records
정보를 순회하면서 입차 정보
를 가져오고, 해당 index
보다 큰 for문을 순회하면서 출차 정보
를 찾는다 코드로 정리하면 다음과 같다.
for i in range(len(records)):
[in_time, in_car_number, in_info] = records[i].split(" ")
# 입차 정보를 찾는다
if in_info == "IN":
# 해당 자동차의 출차 시간을 찾는다
out_time = get_out_time(in_car_number,i,records)
출차시간을 찾을 때 까다로웠던 다음 조건이 까다로웠는데
0000번 차량은 18:59에 입차된 이후, 출차된 내역이 없습니다. 따라서, 23:59에 출차된 것으로 간주합니다.
만약 이중for문을 다돌아도 출차시각을 찾지 못했다면 23:59
을 return한다
def get_out_time(in_car_number,idx,records):
for j in range(idx,len(records)):
[out_time, out_car_number, out_info] = records[j].split(" ")
# 해당 자동차의 출차 정보라면 출차시간을 return 한다
if in_car_number == out_car_number and out_info == "OUT":
return out_time
# 만약 출차 정보를 찾지 못했다면 "23:59"을 return 한다
return "23:59"
출차 시간을 찾았다면 이후에는 간단하다.
자동차 번호판에 대해 누적해서 주차시간을 더한다.
park_time = get_park_time(in_time,out_time)
if in_car_number in cars_park_time:
cars_park_time[in_car_number] += park_time
else :
cars_park_time[in_car_number] = park_time
그리고 자동차 번호판을 오름차순으로 정렬한 후 , 주차요금을 계산한다.
# 자동차 번호판 오름차순으로 정렬한다
cars_park_time = sorted(cars_park_time.items())
# 주차요금을 계산하고 답에 추가한다.
for (car_number,park_time) in cars_park_time:
answer.append(get_fee(fees,park_time))
return answer
차근차근 따라가면 어렵지 않은 문제였다.
dict
를 정렬하는 방법을 배웠다.
1. dict.items()
: key
를 기준으로 오름차순으로 정렬후 pair
리스트를 반환한다.