Python/Algorithm

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

언킴 2023. 8. 25. 20:44
반응형

2022 KAKAO BLIND RECRUITMENT 에서 출제된 문제로, 규칙을 지정하여 푸는 방식이다. 

 

문제 링크: https://school.programmers.co.kr/learn/courses/30/lessons/92341

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

입출력 예

fees = [180, 5000, 10, 600]
records = ["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"]
results = [14600, 34400, 5000]

fees는 [기본 시간, 기본 요금, 단위 시간, 단위 요금]으로 구성되어 있고, records는 [시각, 차량 번호, 내역]으로 구성되어 있다. 마지막 results는 차량 번호의 순서대로 주차 요금을 나타내고 있다.

 

입력 받은 시간은 문자열 형태로 되어 있기 때문에, 이를 변환하는 코드를 작성한다.

def str2min(time):
    hour_, min_ = time.split(':')
    return int(hour_) * 60 + int(min_)

그런 다음, 분석에 필요한 defaultdict와 ceil 함수를 호출하고, 아래와 같이 코드를 작성할 수 있다. 

from collections import defaultdict
from math import ceil

def solution(fees, records):
    default_time, default_fee, unit_time, unit_fee = fees
    assets = defaultdict(int)
    accumulate = defaultdict(int)
    fees = defaultdict(int)
    answers = []
    for record in records:
        times, car_number, types = record.split()
        times = str2min(times)
        if types == 'IN':
            assets[car_number] = times
        
        elif types == 'OUT':
            accumulate[car_number] += times - assets[car_number]
            del assets[car_number]
        
    for car_number, elapsed_time in assets.items():
        elapsed_time = str2min('23:59') - elapsed_time
        accumulate[car_number] += elapsed_time
    
    for car_number, elapsed_time in sorted(accumulate.items(), key = lambda x: x[0]):
        fee = default_fee + max(0, ceil((elapsed_time - default_time)/unit_time) * unit_fee)
        answers.append(fee) 
    
    return answers

record는 records에 값을 불러와 times, car_number, types 형태로 변환한다. types는 입출차를 나타내기 때문에 먼저 입차인지 출차인지를 확인하여야 한다. 입차인 경우 차량 번호에 시작 시간(time)을 저장한다. 출차인 경우에는 입차에 입력된 시간에서 현재까지 몇 분 지났는지를 측정하면 된다. 그런 다음, 입,출차 기록을 지운다.

 

그 다음 for문에서는 assets에 남아있는, 즉, 입차 기록은 있으나 출차 기록이 없는 차량에 대해서 23:59분을 기준으로 누적 주차 시간을 계산한다. 마지막으로, 누적 시간을 바탕으로 주차 요금을 계산하면 된다. ceil은 올림하는 숫자를 나타내며, 만약 기본 시간보다 적게 이용한 차량의 경우 ceil 안의 값이 음수로 나오기 때문에 0을 기준으로 최댓값을 출력하면 된다.