본문 바로가기

알고리즘/프로그래머스

[프로그래머스][2022 KAKAO BLIND RECRUITMENT][Python] 주차 요금 계산

문제를 정리해보자.

 

주차장의 요금표와 차량의 입/출자 기록이 있다. 차량별로 주차요금을 계산하자.

 

기본시간 이하로 이용했다면, 기본요금만 지불한다.

기본시간을 초과했다면, 기본요금 + 추가요금을 지불한다.

 

 

요금표

 

 

입/출차 기록

 

 

기본시간(분) : 180분
기본요금(원) : 5000원

 

단위시간(분) : 10분
단위요금(원) : 600원

 

 

예) 5961
입차 : 5시 34분 (334)
출차 : 7시 59분 (479) = 145분
입차 : 22시 59분 (1379)
출차 : 23시 (1380) = 1분

 

5961 결과

146분 (기본시간 이하) : 5000원

 


예) 0000
입차 : 6시 00분 (360분)
출차 : 6시 34분 (394분) = 34분
입차 : 18시 59분 (1139분)
출차 : 23시 59분 (강제, 1439분) = 300분

(어떤 차량이 입차 된 후에 출차된 내역이 없다면, 23:59에 출차된 것으로 간주합니다.)

 

000 결과
334분 (기본시간 이상) : 334 - 180 = 154분
154분 : 10 * 16 : 600 * 16 = 9600

5000 + 9600 = 14600원 

 


 

풀이를 생각해보자.

 

입/출차 시간은 모두 분으로 바꾸자. 그리고 출차 시간 - 입차 시간을 계산해서 누적시키자.

만약에 출차를 하지 않았다면 계산 값이 0 혹은 음수이다. 그럴 경우 23시 59분에 출차했다고 해주자.

 


 

구현해보자.

 

import math


def solution(fees, records):
    default_t, default_c, unit_t, unit_c = fees[0], fees[1], fees[2], fees[3]

    car_time = {}  # 차량 번호 : 출차 시간 - 입차 시간
    result = {}  # 차량 번호 : 시간

    # 입/출차
    for li in records:
        time, number, check = li.split()
        time = int(time[0:2]) * 60 + int(time[3:5])

        if check == "IN":
            car_time[number] = -time

            if not result.get(number, 0):
                result[number] = 0

        else:  # OUT
            car_time[number] = car_time[number] + time
            result[number] += car_time[number]  # 시간 누적

    for key in result.keys():

        # 강제 출차
        if car_time[key] <= 0:
            result[key] += (car_time[key] + 1439)  # 23시 59분 나감

        total_time = result[key]

        # 기본 시간
        if total_time <= default_t:
            total_time = 0
        else:
            total_time -= default_t

        # 단위 시간
        cash = default_c
        cash += math.ceil(total_time / unit_t) * unit_c

        result[key] = cash  # 차량 번호 : 요금

    # 차량 번호가 작은 순으로 정렬
    answer = [num[1] for num in sorted(result.items())]
    return answer


solution([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"])