코드
from datetime import datetime
import math
def solution(fees, records):
answer = {record.split()[1]:0 for record in records} # 차량번호:누적시간
car = {} # 차량번호:입차시간
for record in records:
time, car_num, inout = record.split()
if inout == 'IN': # IN이면 딕셔너리 car에 입차시간 기록
car[car_num] = datetime.strptime(time,"%H:%M")
else: # OUT이면 주차시간(출차-입차)을 분단위로 변환하여 딕셔너리 answer에 누적
pay = str(datetime.strptime(time,"%H:%M") - car[car_num])
pay = int(pay.split(':')[0]) * 60 + int(pay.split(':')[1])
answer[car_num] += pay
del car[car_num] # 출차를 했으면 입차기록 제거
if len(car) > 0 : # car에 남아있는 요소가 있으면(입차만하고 출차 안함)
for i in car: # 23:59에 출차한 것으로 가정하고 주차시간 계산하여 answer에 누적
pay = str(datetime.strptime('23:59',"%H:%M") - car[i])
pay = int(pay.split(':')[0]) * 60 + int(pay.split(':')[1])
answer[i] += pay
answer = sorted(answer.items()) # key 기준으로 오름차순 정렬
for i in range(len(answer)): # 주차요금 계산
if answer[i][1] <= fees[0]: # 기본 시간 이하이면 기본 요금
answer[i] = fees[1]
else: # 기본 시간 초과이면 기본 요금 + 초과 시간에 대한 요금
answer[i] = fees[1] + math.ceil((answer[i][1] - fees[0])/fees[2]) * fees[3]
return answer
딕셔너리를 사용하면 쉽게 풀 수 있는 문제이다.
먼저 records에 있는 입/출차 내역을 가지고 해당 기록이 입차인지 출차인지 구분한다.
for record in records:
time, car_num, inout = record.split()
if inout == 'IN': # IN이면 딕셔너리 car에 입차시간 기록
car[car_num] = datetime.strptime(time,"%H:%M")
else: # OUT이면 주차시간(출차-입차)을 분단위로 변환하여 딕셔너리 answer에 누적
pay = str(datetime.strptime(time,"%H:%M") - car[car_num])
pay = int(pay.split(':')[0]) * 60 + int(pay.split(':')[1])
answer[car_num] += pay
del car[car_num] # 출차를 했으면 입차기록 제거
입차기록이면 딕셔너리 car에 입차시간을 기록한다.
출차기록이면 car에서 해당 차량번호의 입차기록을 찾아 주차시간(출차-입차)을 계산한다.
주차 요금은 분단위로 부과되므로 주차시간을 분단위로 변환하여 딕셔너리 answer에 누적한다.
해당 차량이 출차가 되었으면 딕셔너리 car에서 해당 차량의 입차 기록을 지운다.
이때 시간 기록은 파이썬 라이브러리 중 datetime을 이용하였다.
문제에서 어떤 차량이 입차된 후에 출차된 내역이 없다면, 23:59에 출차된 것으로 간주한다고 했으므로, 출차내역이 없는지 확인한다.
if len(car) > 0 : # car에 남아있는 요소가 있으면(입차만하고 출차 안함)
for i in car: # 23:59에 출차한 것으로 가정하고 주차시간 계산하여 answer에 누적
pay = str(datetime.strptime('23:59',"%H:%M") - car[i])
pay = int(pay.split(':')[0]) * 60 + int(pay.split(':')[1])
answer[i] += pay
출차기록이 있으면 car에서 입차기록은 지우므로, 출차기록이 없는 차량은 car에 입차기록이 남아있다.
그러므로 car에 요소가 남아있는지 len() 함수를 사용하여 확인한다.
만약 len(car) > 0이면, 딕셔너리 car에 남아있는 차량의 입차기록을 가져와 23:59분에 출차한 것으로 간주하여 주차 시간을 분단위로 계산해 준다.
모든 누적 주차 시간이 계산되었으면, 차량별 주차 요금을 계산한다.
answer = sorted(answer.items()) # key 기준으로 오름차순 정렬
for i in range(len(answer)): # 주차요금 계산
if answer[i][1] <= fees[0]: # 기본 시간 이하이면 기본 요금
answer[i] = fees[1]
else: # 기본 시간 초과이면 기본 요금 + 초과 시간에 대한 요금
answer[i] = fees[1] + math.ceil((answer[i][1] - fees[0])/fees[2]) * fees[3]
문제에서 차량번호 오름차순으로 주차 요금을 출력하라고 했다.
answer는 차량번호:누적시간 형태의 딕셔너리 이므로 key(차량번호)를 기준으로 오름차순 정렬해 준다.
그다음 answer에서 순차적으로 가져와 주차 요금을 계산한다.
반응형