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

박영빈·2023년 7월 16일

Programmers

목록 보기
30/43

주차 요금 계산


설명

  • 어떤 차량이 입차된 후에 출차된 내역이 없다면, 23:59에 출차된 것으로 간주합니다.
    • 0000번 차량은 18:59에 입차된 이후, 출차된 내역이 없습니다. 따라서, 23:59에 출차된 것으로 간주합니다.
  • 00:00부터 23:59까지의 입/출차 내역을 바탕으로 차량별 누적 주차 시간을 계산하여 요금을 일괄로 정산합니다.
  • 누적 주차 시간이 기본 시간이하라면, 기본 요금을 청구합니다.
  • 누적 주차 시간이 기본 시간을 초과하면, 기본 요금에 더해서, 초과한 시간에 대해서 단위 시간 마다 단위 요금을 청구합니다.
  • 초과한 시간이 단위 시간으로 나누어 떨어지지 않으면, 올림합니다.
  • 주차 요금을 나타내는 정수 배열 fees, 자동차의 입/출차 내역을 나타내는 문자열 배열 records가 매개변수로 주어집니다. 차량 번호가 작은 자동차부터 청구할 주차 요금을 차례대로 정수 배열에 담아서 return 하도록 solution 함수를 완성해주세요.
    # for record in records:
    #     car = record[6:10]
    #     time = record[:5]
    #     if record[11:] == "IN":
    #         timestamp[car] = time
    #         cars.append(car)
    #     elif record[11:] == "OUT":
    #         feeList[car] += getFee(timestamp[car], time, fees)
    #         cars.remove(car)
    # print(timestamp,cars)
    # for car in cars:
    #     feeList[car] += getFee(timestamp[car], "23:59", fees)
    # cars = sorted(list(timestamp.keys()))
    # print(cars)
    # for car in cars:
    #     answer.append(feeList[car])
  • 처음에 같은 차가 두 번 주차할 수 있는 점을 놓쳐서 짰다가 싹 지우고 다시 했다.
  • 출차 내역 없는 차 조회하는 방법을 차 목록에서 출차마다 빼는 방법으로 했으니 당연히 안된다.
from collections import defaultdict
import math

def getFee(start, end, fee):
    start = int(start[:2])*60+int(start[3:5])
    end = int(end[:2])*60+int(end[3:5])
    tmp = end-start
    if tmp <= fee[0]:
        return fee[1]
    else:
        return math.ceil((tmp-fee[0])/fee[2])*fee[3]+fee[1]

def solution(fees, records):
    answer = []
    timestamps = defaultdict(int)
    feeList = defaultdict(int)
    cars = []
    
    for record in records:
        car = record[6:10]
        time = record[:5]
        action = record[11:]
        if action == 'IN':
            timestamps[car] -= int(time[:2])*60 + int(time[3:5])
        elif action == 'OUT':
            timestamps[car] += int(time[:2])*60 + int(time[3:5])
    # print(timestamps)
    for car, time in timestamps.items():
        if time<=0:
            time += 23*60+59
        if time <= fees[0]:
            feeList[car] = fees[1]
        else:
            feeList[car] = math.ceil((time-fees[0])/fees[2])*fees[3]+fees[1]
    # print(feeList)
    cars = sorted(list(timestamps.keys()))
    for car in cars:
        answer.append(feeList[car])

    return answer
  • 문제 예시도 출력 결과가 그렇고 입/출차마다 시간을 계속해서 누적하여 구하라고 하는것처럼 보였다.
  • 그래서 해시를 쓰는건 그대로 하되, 시간을 기록하는 식으로 하려다가 너무 번거로웠다.
  • 최종적으로는 입차시 현재 시간만큼을 빼고, 출차시 현재 시간만큼을 더했다.
    • 대신 최종 출차가 없는 차량에 대해 체크 하는 방법을 따로 생각해야 한다.
    • 이렇게 하면 정확히 주차한 시간만큼을 계산 가능하다.
  • 별도로 체크하는건 너무 멋없어 보여서 곰곰히 다시 생각해보니 위 알고리즘에서는 최종 출차가 없는 차는 누적시간이 반드시 음수가 될 수 밖에 없다.
  • 따라서 최종 출차기록이 없는, 즉 누적 주차시간이 음수인 차량은 최종적으로 23:59에 출차한 것으로 가정하여 누적시간을 더하였다.
  • 마지막으로 주어진 조건에 맞게 요금을 계산하고, 차량번호를 잘 정렬하여 출력하였다.
profile
안녕하세요<br>반가워요<br>안녕히가세요

0개의 댓글