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

hyun·2022년 5월 16일
0

알고리즘 문제

목록 보기
8/10
post-thumbnail

https://programmers.co.kr/learn/courses/30/lessons/92341

문제 이해


누적 주차 시간을 계산한 후,

  • 누적 주차 시간이 기본 시간 이하라면 기본 요금
  • 누적 주차 시간이 기본 시간 초과하면 기본 요금 + 초과한 시간에 대한 단위 시간 * 단위 요금
    • 이 때 초과한 시간이 단위 시간으로 나누어 떨어지지 않는다면 올림 처리
  • 입차하고 출차하지 않은 차는 23:59에 출차한 것으로 간주

이 절차대로 요금을 계산해서 리턴해주는 문제이다. 차량 번호가 작은 순서대로 주차요금을 출력해야 한다.

문제 접근

두 가지 딕셔너리를 만들어서 데이터를 관리한다.

  • parkinglot: 말 그대로 주차장 역할을 하는 변수로, 입차하면 주차장에 차를 넣고 출차하면 차를 빼줄 것이다.
  • parkRecord: 각 차의 주차 시간을 관리한다.

주요 로직은 이렇다.

  1. 입차하는 경우 parkinglot에 차량 번호와 입차 시간을 넣는다.
  2. 출차하는 경우 parkinglot에서 차를 삭제하고, 차량 번호와 누적 시간을 parkRecord에 넣는다.
  3. 주차장에 차량이 남아 있는 경우 23:59에 출차한 것으로 간주하여 parkRecord를 갱신해준다.

코드

from math import ceil
from collections import defaultdict

def getMinute(time):
    hour, minute = map(int, time.split(':'))
    return hour * 60 + minute


def getFee(total_time, default_time, default_fee, unit_time, unit_fee):
    extra_time = max(0, total_time - default_time)
    extra_fee = ceil(extra_time / unit_time) * unit_fee
    return default_fee + extra_fee


def solution(fees, records):
    answer = []
    default_time, default_fee, unit_time, unit_fee = fees

    parkRecord = defaultdict(int)
    parkinglot = dict()

    for record in records:
        time, car, inout = record.split()
        time = getMinute(time)
        if inout == "IN":
            parkinglot[car] = time
        else:
            parkRecord[car] += (time - parkinglot[car])
            del parkinglot[car] # 주차장에서 차 빼기

    # 남은 차 처리 (아직 출차 안한 차)
    for car in parkinglot:
        parkRecord[car] += (getMinute("23:59") - parkinglot[car])

    for car in parkRecord:
        fee = getFee(parkRecord[car], default_time, default_fee, unit_time, unit_fee)
        answer.append([car, fee])

    answer.sort()
    answer = [x[1] for x in answer]

    return answer

마치며

주로 코딩테스트의 1번 문제로 나오는 쉬운 구현문제였지만, 의외로 어렵게 느껴졌다. 알고리즘 공부에 손을 놓은 지 오래 되어서 그런 것 같다. 이런 문제들은 30분 내에 풀 수 있도록, 재활훈련을 계속하자.

profile
프론트엔드를 공부하고 있습니다.

0개의 댓글