문제 요약
https://school.programmers.co.kr/learn/courses/30/lessons/92341
차량번호의 입출차 기록을 통해 주차 요금을 계산하는 문제다.
기본 시간이 넘어가면 기본 요금에 단위시간 당 단위요금을 더해준다.
출차 기록이 없으면 출차 시각은 23:59으로 한다.
차량 번호가 작은 자동차부터 주차 요금을 정렬해 배열로 반환한다.
접근
records를 for문으로 돌리면서 parked 딕셔너리에 입차한 차량의 정보를 넣어주었다.
record가 출차 기록이라면 get_dif 함수를 통해 주차 시간을 계산해 total_time[car]
에 더하고 parked 딕셔너리에서 삭제했다.
get_dif 함수에서는 시각 정보가 string으로 주어졌기 때문에 map함수로 시간과 분을 따로 나누어 정수로 변환했다.
parked 딕셔너리에 남은 입차한 차량에 대해서는 23:59에 출차한 것으로 간주하고 주차 시간을 total_time[car]
에 더해주었다.
그리고 get_fee 함수를 통해 total_time에 따른 요금을 계산했다.
풀이
import math
def solution(fees, records):
answer = []
base_time, base_fee, unit_time, unit_fee = fees
def get_dif(srt, end):
srt_hr, srt_min = map(int, srt.split(":"))
end_hr, end_min = map(int, end.split(":"))
minute = 0
if srt_min > end_min:
minute += end_min - srt_min + 60
end_hr -= 1
else:
minute += end_min - srt_min
minute += (end_hr - srt_hr) * 60
return minute
def get_fee(total_min):
nonlocal base_fee
nonlocal base_time
nonlocal unit_fee
nonlocal unit_time
if total_min <= base_time:
return base_fee
else:
return base_fee + math.ceil((total_min - base_time) / unit_time) * unit_fee
parked = {}
total_time = {}
for record in records:
time, car, inout = record.split()
if inout == "IN":
parked[car] = time
else:
if car in total_time:
total_time[car] += get_dif(parked[car], time)
else:
total_time[car] = get_dif(parked[car], time)
parked.pop(car)
for car in parked:
if car in total_time:
total_time[car] += get_dif(parked[car], "23:59")
else:
total_time[car] = get_dif(parked[car], "23:59")
total_fee = []
for car in total_time:
total_fee.append((car, get_fee(total_time[car])))
total_fee.sort(key=lambda x: x[0])
for i in total_fee:
answer.append(i[1])
return answer
'코테 준비' 카테고리의 다른 글
[프로그래머스] 파괴되지 않은 건물 (0) | 2024.03.07 |
---|---|
[프로그래머스] 다단계 칫솔 판매 (Python) (0) | 2024.03.07 |
[프로그래머스] 둘만의 암호 (Python) (0) | 2024.03.07 |
[백준] 가장 긴 증가하는 부분 수열2 (Python) (0) | 2024.03.02 |
[프로그래머스] 110 옮기기 (0) | 2024.02.29 |