주차 요금 계산
설명
- 어떤 차량이 입차된 후에 출차된 내역이 없다면, 23:59에 출차된 것으로 간주합니다.
- 0000번 차량은 18:59에 입차된 이후, 출차된 내역이 없습니다. 따라서, 23:59에 출차된 것으로 간주합니다.
- 00:00부터 23:59까지의 입/출차 내역을 바탕으로 차량별 누적 주차 시간을 계산하여 요금을 일괄로 정산합니다.
- 누적 주차 시간이 기본 시간이하라면, 기본 요금을 청구합니다.
- 누적 주차 시간이 기본 시간을 초과하면, 기본 요금에 더해서, 초과한 시간에 대해서 단위 시간 마다 단위 요금을 청구합니다.
- 초과한 시간이 단위 시간으로 나누어 떨어지지 않으면, 올림합니다.
- 주차 요금을 나타내는 정수 배열 fees, 자동차의 입/출차 내역을 나타내는 문자열 배열 records가 매개변수로 주어집니다. 차량 번호가 작은 자동차부터 청구할 주차 요금을 차례대로 정수 배열에 담아서 return 하도록 solution 함수를 완성해주세요.
# for record in records:
# car = record[6:10]
# time = record[:5]
# if record[11:] == "IN":
# timestamp[car] = time
# cars.append(car)
# elif record[11:] == "OUT":
# feeList[car] += getFee(timestamp[car], time, fees)
# cars.remove(car)
# print(timestamp,cars)
# for car in cars:
# feeList[car] += getFee(timestamp[car], "23:59", fees)
# cars = sorted(list(timestamp.keys()))
# print(cars)
# for car in cars:
# answer.append(feeList[car])
- 처음에 같은 차가 두 번 주차할 수 있는 점을 놓쳐서 짰다가 싹 지우고 다시 했다.
- 출차 내역 없는 차 조회하는 방법을 차 목록에서 출차마다 빼는 방법으로 했으니 당연히 안된다.
from collections import defaultdict
import math
def getFee(start, end, fee):
start = int(start[:2])*60+int(start[3:5])
end = int(end[:2])*60+int(end[3:5])
tmp = end-start
if tmp <= fee[0]:
return fee[1]
else:
return math.ceil((tmp-fee[0])/fee[2])*fee[3]+fee[1]
def solution(fees, records):
answer = []
timestamps = defaultdict(int)
feeList = defaultdict(int)
cars = []
for record in records:
car = record[6:10]
time = record[:5]
action = record[11:]
if action == 'IN':
timestamps[car] -= int(time[:2])*60 + int(time[3:5])
elif action == 'OUT':
timestamps[car] += int(time[:2])*60 + int(time[3:5])
# print(timestamps)
for car, time in timestamps.items():
if time<=0:
time += 23*60+59
if time <= fees[0]:
feeList[car] = fees[1]
else:
feeList[car] = math.ceil((time-fees[0])/fees[2])*fees[3]+fees[1]
# print(feeList)
cars = sorted(list(timestamps.keys()))
for car in cars:
answer.append(feeList[car])
return answer
- 문제 예시도 출력 결과가 그렇고 입/출차마다 시간을 계속해서 누적하여 구하라고 하는것처럼 보였다.
- 그래서 해시를 쓰는건 그대로 하되, 시간을 기록하는 식으로 하려다가 너무 번거로웠다.
- 최종적으로는 입차시 현재 시간만큼을 빼고, 출차시 현재 시간만큼을 더했다.
- 대신 최종 출차가 없는 차량에 대해 체크 하는 방법을 따로 생각해야 한다.
- 이렇게 하면 정확히 주차한 시간만큼을 계산 가능하다.
- 별도로 체크하는건 너무 멋없어 보여서 곰곰히 다시 생각해보니 위 알고리즘에서는 최종 출차가 없는 차는 누적시간이 반드시 음수가 될 수 밖에 없다.
- 따라서 최종 출차기록이 없는, 즉 누적 주차시간이 음수인 차량은 최종적으로 23:59에 출차한 것으로 가정하여 누적시간을 더하였다.
- 마지막으로 주어진 조건에 맞게 요금을 계산하고, 차량번호를 잘 정렬하여 출력하였다.