관리 메뉴

커리까지

[프로그래머스] 2022 카카오 블라인드 주차 요금 계산 본문

알고리즘/풀이

[프로그래머스] 2022 카카오 블라인드 주차 요금 계산

목표는 커리 2022. 10. 6. 21:39
728x90
SMALL

제출 답안

  • 언뜻 보면 어려울 것 같지만 시간 변환과 in, out 관리만 잘해주면 쉽게 풀 수 있다.

  • set_car_info

    1. 처음 주차 했을 때 가져야 할 기본 값들을 지정해 놓았다.
    2. 만약에 parking 에 차 번호가 없으면 이 함수의 리턴값을 기본 값으로 가지도록 하였다.
  • cal_time

    1. 시간의 범위를 계산하는 함수이다.
    2. OUT 일 때만 계산하기 때문에 차 번호의 이전 주차 시간이랑 현재 주차 시간을 매개변수로 사용한다.
    3. 시간에 60을 곱해서 분으로 만들고 minute랑 더해서 지금 시간 - 이전 시간을 리턴한다.
  • cal_fees

    1. 주차 비용을 계산하는 함수이다.
    2. 문제에서 주어진 fees를 각각 변수에 할당한다.
    3. 기본 시간이랑 현재 차 번호가 주차한 시간을 계산한다.
    4. 기본 시간 이하면 기본 비용을, 기본 시간 이상이면 추가 비용을 계산해서 리턴한다.
      1. 여기서 math.celi을 사용하면 값을 올림한다.
  • solution

    1. parking은 주차 정보를 담는다.
    2. answer는 최종 비용을 담는다.
    3. not_out_number는 마지막까지 출차하지 않은 차 번호를 담는다.
      1. deque로 생성한 이유는 빈번하게 삽입, 삭제가 진행되기에 선택하였다.
    4. 먼저 주차 기록을 :으로 split한다.
    5. 차의 정보를 가져온다.
      1. 처음 주차는 기본 정보를, 이미 주차했던 경우는 기존 내역을 가져오게 된다.
    6. 만약 차가 출차하는 경우라면 주차 시간을 계산하여 기존 주차 시간에 합산하고, not_out_number에서 차 번호를 삭제한다.
    7. 주차하러 들어온 경우 not_out_number에 차 번호를 추가한다.
    8. 만약 마지막까지 출차하지 않았으면 23:59와 기존 주차 시간을 계산하여 주차 시간에 합산한다.
    9. 차 번호대로 오름차순을 수행한다.
    10. parking 의 values를 순회하며 주차비를 계산하고, answer에 삽입한다.
    11. 마지막으로 answer를 리턴한다.
from collections import deque
import math
def set_car_info(parking_time, in_out):
    return {"parking_time" : parking_time, "in_out" : in_out, "parking_range" : 0}

def cal_time(before, after):
    before_hour, before_minute = before.split(":")
    after_hour, after_minute = after.split(":")
    before_time = int(before_hour) * 60 + int(before_minute)
    after_time = int(after_hour) * 60 + int(after_minute)
    return after_time - before_time

def cal_fees(parking_range, fees):
    default_time, default_fee, add_time, add_fee = fees
    diff_time = default_time - parking_range
    if 0 <= diff_time:
        return default_fee
    else:
        total_fee = default_fee + math.ceil(abs(diff_time) / add_time) * add_fee
        return total_fee

def solution(fees, records):
    parking = {}
    answer = []
    not_out_number = deque()
    for record in records:
        parking_time, car_number, in_out = record.split(" ")
        car_info = parking.get(car_number, set_car_info(parking_time, in_out))
        if in_out == 'OUT':
            car_info["parking_range"] += cal_time(car_info["parking_time"], parking_time)
            not_out_number.remove(car_number)
        elif in_out == 'IN':
            not_out_number.append(car_number)
        parking[car_number] = {**car_info, "parking_time" : parking_time, "in_out" : in_out}
    for car_number in not_out_number:
        parking[car_number]["parking_range"] += cal_time(parking[car_number]["parking_time"], "23:59")
    parking = dict(sorted(parking.items()))
    for value in parking.values():
        total_fee = cal_fees(value['parking_range'], fees)
        answer.append(total_fee)
    return answer
728x90
LIST
Comments