본문 바로가기
코테 준비

[프로그래머스] 주차 요금 계산

by 박수련 2024. 3. 7.

문제 요약

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