https://programmers.co.kr/learn/courses/30/lessons/92341
누적 주차 시간을 계산한 후,
이 절차대로 요금을 계산해서 리턴해주는 문제이다. 차량 번호가 작은 순서대로 주차요금을 출력해야 한다.
두 가지 딕셔너리를 만들어서 데이터를 관리한다.
parkinglot
: 말 그대로 주차장 역할을 하는 변수로, 입차하면 주차장에 차를 넣고 출차하면 차를 빼줄 것이다.parkRecord
: 각 차의 주차 시간을 관리한다. 주요 로직은 이렇다.
parkinglot
에 차량 번호와 입차 시간을 넣는다. parkinglot
에서 차를 삭제하고, 차량 번호와 누적 시간을 parkRecord
에 넣는다.parkRecord
를 갱신해준다.from math import ceil
from collections import defaultdict
def getMinute(time):
hour, minute = map(int, time.split(':'))
return hour * 60 + minute
def getFee(total_time, default_time, default_fee, unit_time, unit_fee):
extra_time = max(0, total_time - default_time)
extra_fee = ceil(extra_time / unit_time) * unit_fee
return default_fee + extra_fee
def solution(fees, records):
answer = []
default_time, default_fee, unit_time, unit_fee = fees
parkRecord = defaultdict(int)
parkinglot = dict()
for record in records:
time, car, inout = record.split()
time = getMinute(time)
if inout == "IN":
parkinglot[car] = time
else:
parkRecord[car] += (time - parkinglot[car])
del parkinglot[car] # 주차장에서 차 빼기
# 남은 차 처리 (아직 출차 안한 차)
for car in parkinglot:
parkRecord[car] += (getMinute("23:59") - parkinglot[car])
for car in parkRecord:
fee = getFee(parkRecord[car], default_time, default_fee, unit_time, unit_fee)
answer.append([car, fee])
answer.sort()
answer = [x[1] for x in answer]
return answer
주로 코딩테스트의 1번 문제로 나오는 쉬운 구현문제였지만, 의외로 어렵게 느껴졌다. 알고리즘 공부에 손을 놓은 지 오래 되어서 그런 것 같다. 이런 문제들은 30분 내에 풀 수 있도록, 재활훈련을 계속하자.