🤔 문제


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

 

코딩테스트 연습 - 주차 요금 계산

[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"] [14600, 34400, 5000]

programmers.co.kr

 

😀 풀이


주차 요금 계산 문제는 입차하는 차량과 출차하는 차량을 관리하는 dictionary, 각 차량의 주차 시간을 관리하는 dictionary 즉, 두 개의 dictionary를 만들어 풀이했습니다.

1. 입차하는 차량과 출차하는 차량은 parkingLot에서 관리합니다.
2. 각 차량의 주차 시간 관리는 parkRecord에서 관리합니다.

 

주요 로직은 아래와 같습니다.

1. 입차하는 경우 parkingLot에 차량 번호를 입차 시간과 함께 기록합니다.
2. 출차하는 경우 parkingLot에서 꺼내고 차량 번호와 함께 입차 시간을 parkRecord에 기록합니다.

3. 모든 record를 확인한 뒤에도 주차장에 차량이 있는 경우 23:59분에 출차한 것으로 취급하여 parkRecord를 갱신해줍니다.

4.  정답은 문제의 조건에 맞게 차량 번호순으로 정렬하고 각 차량의 주차 요금을 계산하여 만들어줍니다. 

 

이때 시간 문자열을 분 단위로 변경하는 getTime 함수와 주차 시간이 주어지면 주차 요금을 계산하는 calcFee 함수를 정의하여 사용했습니다.

 

💻 풀이 코드는 아래와 같습니다.

from collections import defaultdict
from math import ceil

def getTime(time):
    h, m = time.split(':')
    return int(h) * 60 + int(m)

def calcFee(time, baseTime, baseFee, unitTime, unitFee):
    extraTime = max(0, time - baseTime)
    extraFee = ceil(extraTime / unitTime) * unitFee
    return baseFee + extraFee

def solution(fees, records):
    answer = []
    parkRecord = defaultdict(int)
    parkingLot = dict()
    baseTime, baseFee, unitTime, unitFee = fees

    for record in records:
        time, carNumber, type = record.split(' ')
        time = getTime(time)
        if type == "IN":
            parkingLot[carNumber] = time
        else:
            parkRecord[carNumber] += (time - parkingLot[carNumber])
            del parkingLot[carNumber]
    # 남은 차 처리
    for carNumber in parkingLot:
        parkRecord[carNumber] += (getTime("23:59") - parkingLot[carNumber])

    for carNumber in parkRecord:
        fee = calcFee(parkRecord[carNumber], baseTime, baseFee, unitTime, unitFee)
        answer.append([carNumber, fee])
    answer.sort()
    answer = [x[1] for x in answer]
    return answer
반응형
복사했습니다!