1. 문제 설명
주차장의 요금표와 차량이 들어오고(입차) 나간(출차) 기록이 주어졌을 때, 차량별로 주차 요금을 계산하려고 한다.
어떤 차량이 입차된 후에 출차된 내역이 없다면, 23:59에 출차된 것으로 간주한다.
00:00부터 23:59까지의 입/출차 내역을 바탕으로 차량별 누적 주차 시간을 계산하여 요금을 일괄로 정산한다.
- 누적 주차 시간이 기본 시간 이하라면, 기본 요금을 청구한다.
- 누적 주차 시간이 기본 시간을 초과하면, 기본 요금에 더해서, 초과한 시간에 대해서 단위 시간 마다 단위 요금을 청구한다.
(단, 초과한 시간이 단위 시간으로 나누어 떨어지지 않으면, 올림한다.)
차량 번호가 작은 자동차부터 청구할 주차 요금을 차례대로 정수 배열에 담아서 반환하라.
2. 코드
import math
def solution(fees, records):
default_time, default_fee, unit_time, unit_fee = fees[0], fees[1], fees[2], fees[3]
record_dict = {}
answer = {}
# 출입 기록 저장
for record in records:
a, b, _ = record.split(' ')
if b in record_dict.keys():
record_dict[b].append(a)
else:
record_dict[b] = [a]
# 정산
for car, in_out in record_dict.items():
park_m = 0
while in_out:
if len(in_out) == 1:
in_h, in_m = map(int, in_out[0].split(':'))
out_h, out_m = 23, 59
if out_m >= in_m:
park_m += (out_h - in_h) * 60 + (out_m - in_m)
else:
park_m += (out_h - 1 - in_h) * 60 + (out_m + 60 - in_m)
break
else:
in_h, in_m = map(int, in_out[0].split(':'))
out_h, out_m = map(int, in_out[1].split(':'))
if out_m >= in_m:
park_m += (out_h - in_h) * 60 + (out_m - in_m)
else:
park_m += (out_h - 1 - in_h) * 60 + (out_m + 60 - in_m)
in_out = in_out[2:]
if park_m <= default_time:
answer[car] = default_fee
else:
answer[car] = default_fee + math.ceil((park_m - default_time) / unit_time) * unit_fee
return [v for k,v in sorted(answer.items())]
3. 설명
우선 출입 차량에 대해서 딕셔너리로 기록하는데, 이때 in과 out은 순서가 정해져있기 때문에 신경쓰지 않았다.
만약 이미 딕셔너리에 저장되어있는 차량이라면, 딕셔너리 value인 리스트에 값을 추가하고,
그렇지 않은 경우에는 리스트를 추가한다.
저장한 출입 기록을 for문으로 돌면서 정산을 한다.
만약 in_out이 1인 경우에는 in 만 하고 out을 안 한 경우이기 때문에 나간 시간을 23:59으로 설정해준다.
math 라이브러리의 ceil 함수를 사용해서 올림 처리해준다.
'Algorithm' 카테고리의 다른 글
프로그래머스 > 스킬트리 (Python 3) (0) | 2024.08.06 |
---|---|
프로그래머스 > 더 맵게 (Python 3) (0) | 2024.08.05 |
프로그래머스 > 땅따먹기 (Python 3) (0) | 2024.08.03 |
프로그래머스 > 방문 길이 (Python3) (0) | 2024.08.02 |
프로그래머스 > 뒤에 있는 큰 수 찾기 (Python 3) (0) | 2024.07.31 |