https://school.programmers.co.kr/learn/courses/30/lessons/92341
문제 파악
먼저 IN과 OUT을 구분해 주어야겠다고 생각했다.
IN일 때는 딕셔너리 차량 번호 = 입차 시간으로 넣어주고 OUT일 때는 출차 시간에서 입차 시간을 뺀 값을 계산해 준 후 딕셔너리에서 pop 해주었다. 이때 datetime.strptime은 초(second) 단위로 계산되기 때문에 나누기 60을 해주었다.
반복문이 끝난 후 입차는 했지만 출차하지 않은 차량을 확인해 주었다. 즉, 반복문이 끝났음에도 딕셔너리에 남아있는 차량들의 요금을 계산했다. 출차를 안 한 차량은 23:59 출차로 계산해야 한다고 문제에 나와있기 때문에 23:59에서 입차 시간을 빼주었다.
이후 문제에서 차량 번호 순으로 정렬된 요금을 요구하고 있기 때문에 차량 번호와 입차 시간이 묶인 딕셔너리를 정렬해 주었다.
마지막으로 정렬된 차량별 요금을 문제에 나와있는 공식대로 계산해 주고 답안 리스트에 넣어주었다.
정답 코드
from datetime import datetime
from math import ceil
def solution(fees, records):
dic = {}; time = {}; answer = []
base, base_fee, minute, minute_fee = fees[0], fees[1], fees[2], fees[3]
for i in records:
time[i.split()[1]] = 0
for i in records:
i = i.split()
if i[2]=="IN" and i[1] not in dic:
dic[i[1]] = i[0]
elif i[2] == "OUT" and i[1] in dic:
past = datetime.strptime(dic[i[1]], "%H:%M")
now = datetime.strptime(i[0], "%H:%M")
time[i[1]] += ((now-past).seconds // 60)
dic.pop(i[1])
if dic:
for i in dic.items():
last = datetime.strptime("23:59", "%H:%M")
past = datetime.strptime(i[1], "%H:%M")
time[i[0]] += (last-past).seconds // 60
stime = sorted(time.items())
for t in stime:
if t[1] > base:
answer.append(base_fee + ceil((t[1] - base) / minute) * minute_fee)
else:
answer.append(base_fee)
return answer