여름의 서재

[프로그래머스] 주차 요금 계산 (파이썬) 본문

알고리즘/프로그래머스

[프로그래머스] 주차 요금 계산 (파이썬)

엉아_ 2022. 2. 6. 02:50
728x90

📕 문제

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

 

💡 풀이법

1. 차의 입차 시간과 담을 cars 딕셔너리를 만든다.

2. 차들의 총 주차 시간을 담을 total 딕셔너리를 만든다.

3. records를 돌면서 cars에 입차 시간 을 담고 출차를 하면 출차시간에서 딕셔너리에 저장된 입차시간을 빼서 total에 추가한다. (출차를 할때는 cars에 저장된 입차 시간을 없애준다.)

4. records를 다 돌고도 cars에 입차 시간이 남아있으면 23:59분에 출차한 것으로 간주한다고 했으므로 한번 더 계산해준다.

5. total을 돌면서 주차 시간으로 주차 요금을 계산한다.

from collections import defaultdict
import math

def solution(fees, records):
    basic_time, basic_fee, unit_time, unit_fee = fees
    cars = {}
    total = defaultdict(int)
    for rec in records:
        time, car, state = rec.split()
        if state == 'IN':
            cars[car] = time
        else:
            out_h, out_m = map(int, time.split(':'))
            in_h, in_m = map(int, cars[car].split(':'))
            total[car] += (out_h * 60 + out_m) - (in_h * 60 + in_m)
            del cars[car]

    for car, time in cars.items():
        in_h, in_m = map(int, time.split(':'))
        total[car] += 1439 - (in_h * 60 + in_m)

    for car, time in total.items():
        if time <= basic_time:
            total[car] = basic_fee
        else:
            fee = basic_fee + math.ceil((time - basic_time)/unit_time) * unit_fee
            total[car] = fee

    answer = [value for key, value in sorted(total.items(), key=lambda x : x[0])]
    return answer
Comments