주차장의 요금표와 차량이 들어오고(입차) 나간(출차) 기록이 주어졌을 때, 차량별로 주차 요금을 계산하려고 합니다. 아래는 하나의 예시를 나타냅니다.
기본 시간(분) 기본 요금(원) 단위 시간(분) 단위 요금(원)
180 5000 10 600
시각(시:분) 차량 번호 내역
05:34 5961 입차
06:00 0000 입차
06:34 0000 출차
07:59 5961 출차
07:59 0148 입차
18:59 0000 입차
19:09 0148 출차
22:59 5961 입차
23:00 5961 출차
차량 번호 누적 주차 시간(분) 주차 요금(원)
0000 34 + 300 = 334 5000 + ⌈(334 - 180) / 10⌉ x 600 = 14600
0148 670 5000 +⌈(670 - 180) / 10⌉x 600 = 34400
5961 145 + 1 = 146 5000
주차 요금을 나타내는 정수 배열 fees, 자동차의 입/출차 내역을 나타내는 문자열 배열 records가 매개변수로 주어집니다. 차량 번호가 작은 자동차부터 청구할 주차 요금을 차례대로 정수 배열에 담아서 return 하도록 solution 함수를 완성해주세요.
fees records result
[180, 5000, 10, 600] ["05:34 5961 IN", "06:00 0000 IN", "06:34 0000 OUT", "07:59 5961 OUT", "07:59 0148 IN",
"18:59 0000 IN", "19:09 0148 OUT", "22:59 5961 IN", "23:00 5961 OUT"] [14600, 34400, 5000]
[120, 0, 60, 591] ["16:00 3961 IN","16:00 0202 IN","18:00 3961 OUT","18:00 0202 OUT","23:58 3961 IN"] [0, 591]
[1, 461, 1, 10] ["00:00 1234 IN"] [14841]
입출력 예 #1
문제 예시와 같습니다.
입출력 예 #2
기본 시간(분) 기본 요금(원) 단위 시간(분) 단위 요금(원)
120 0 60 591
시각(시:분) 차량 번호 내역
16:00 3961 입차
16:00 0202 입차
18:00 3961 출차
18:00 0202 출차
23:58 3961 입차
차량 번호 누적 주차 시간(분) 주차 요금(원)
0202 120 0
3961 120 + 1 = 121 0 +⌈(121 - 120) / 60⌉x 591 = 591
입출력 예 #3
기본 시간(분) 기본 요금(원) 단위 시간(분) 단위 요금(원)
1 461 1 10
시각(시:분) 차량 번호 내역
00:00 1234 입차
차량 번호 누적 주차 시간(분) 주차 요금(원)
1234 1439 461 +⌈(1439 - 1) / 1⌉x 10 = 14841
1234번 차량은 출차 내역이 없으므로, 23:59에 출차되었다고 간주합니다.
정확성 테스트 : 10초
주차된 차량, 차량의 기록, 정산된 요금, 총 주차 시간을 collections의 defaultdict()를 사용하여 관리하였다. key는 차량 번호가 된다. defaultdict()를 사용함으로써 key error를 방지하였다.
records를 순회하며 값을 빈칸을 기준으로 split하고, 이 값들 중에서 시간을 나타내는 문자열을 ':'을 기준으로 split하여 차량 기록 딕셔너리에 [타입(IN/OUT), 시, 분]을 넣어준다. 이때 튜플이 아닌 리스트로 넣어줘야 다음에 있을 값 변경이 가능하다.
차량의 기록 딕셔너리를 순회하며 타입이 IN일 경우 주차된 차량에 [시, 분]을 넣어주고, OUT일 경우 주차된 차량에 저장된 [시, 분]과 현재의 시, 분을 계산하여 총 주차 시간 딕셔너리의 값을 증가시켜주고, 주차된 차량 딕셔너리에서 해당 차량을 삭제해준다.
위의 과정이 끝났을 때, 주차된 차량이 남아있을 경우, 주차된 차량 딕셔너리를 순회하며 [시, 분]을 23:59와 계산하여 총 주차 시간 딕셔너리를 증가시킨다.
마지막으로 총 주차 시간 딕셔너리를 순회하며 정산된 요금 딕셔너리를 계산하여 넣어주고, 정산된 요금 딕셔너리를 key의 오름차순으로 정렬한 후에 해당 value를 answer에 넣어주면 문제가 해결된다.
defaultdict(list)
로 선언한다.defaultdict(list)
로 선언한다.defaultdict(int)
로 선언한다.defaultdict(int)
로 선언한다.records[i]
를 빈칸을 기준으로 split한 리스트를 저장한다.tmp[0]
을 ':'을 기준으로 split한 값을 int형으로 저장한다.in_out[tmp[1]]
에 [tmp[2], h, m]
을 넣는다.value[i][0]
이 IN일 경우,parked[key]
에 [value[i][1], value[i][2]]
를 넣는다.value[i][0]
이 OUT일 경우,parked[key][0][1]
이 value[i][2]
보다 클 경우,value[i][1]
을 1 감소시킨다.value[i][2]
를 60 증가시킨다.time[key]
를 value[i][2]-parked[key][0][1]
만큼 증가시킨다.time[key]
를 (value[i][1]-parked[key][0][0])*60
만큼 증가시킨다.time[key]
를 value[i][2]-parked[key][0][1]
만큼 증가시킨다.time[key]
를 (value[i][1]-parked[key][0][0])*60
만큼 증가시킨다.parked[key]
를 삭제한다.time[key]
를 59-value[0][1]
만큼 증가시킨다.time[key]
를 (23-value[0][0])*60
만큼 증가시킨다.fees[0]
보다 작을 경우,result[key]
에 fees[1]
을 더한다.value-fees[0]
을 fees[2]
로 나눈 나머지가 0보다 클 경우,result[key]
를 ((value-fees[0])//fees[2]+1)*fees[3]+fees[1]
만큼 증가시킨다. (올림)result[key]
를 ((value-fees[0])//fees[2])*fees[3]+fees[1]
만큼 증가시킨다.import collections
def solution(fees, records):
answer=[]
parked=collections.defaultdict(list)
in_out=collections.defaultdict(list)
result=collections.defaultdict(int)
time=collections.defaultdict(int)
for i in range(len(records)):
tmp=list(records[i].split())
h, m=map(int, tmp[0].split(':'))
in_out[tmp[1]].append([tmp[2], h, m])
for key, value in in_out.items():
for i in range(len(value)):
if value[i][0]=='IN':
parked[key].append([value[i][1], value[i][2]])
if value[i][0]=='OUT':
if parked[key][0][1]>value[i][2]:
value[i][1]-=1
value[i][2]+=60
time[key]+=value[i][2]-parked[key][0][1]
time[key]+=(value[i][1]-parked[key][0][0])*60
else:
time[key]+=value[i][2]-parked[key][0][1]
time[key]+=(value[i][1]-parked[key][0][0])*60
del parked[key]
if parked:
for key, value in parked.items():
time[key]+=59-value[0][1]
time[key]+=(23-value[0][0])*60
for key, value in time.items():
if value<=fees[0]:
result[key]+=fees[1]
else:
if (value-fees[0])%fees[2]>0:
result[key]+=((value-fees[0])//fees[2]+1)*fees[3]+fees[1]
else:
result[key]+=((value-fees[0])//fees[2])*fees[3]+fees[1]
result=sorted(result.items())
for num, cost in result:
answer.append(cost)
return answer