코딩테스트/프로그래머스

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

ye0nn 2022. 5. 24. 23:22

 

 

 

 

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

 

 

 

 

✅ Solution

  • defaultdict을 이용하여 차량별로 입/출차 내역을 저장해둔다. 
  • 그리고 defaultdict, infos의 키를 확인하면서 주차 요금을 계산해준다.
    • 만약 해당 키 값이 홀수라면 마지막 출차 기록이 없다는 의미로 23:59에 출차된 것으로 간주하여 계산한다.
    • 만약 해당 키 값이 짝수라면 출차-입차 시간으로 계산한다.
  • 차량 번호와 요금을 answer에 넣은 뒤, 차량 번호로 정렬하여 요금을 리턴한다.

 

 

 

 

 

✅ Code

import math
from collections import defaultdict

def solution(fees, records):
    answer = []
    infos = defaultdict(list)

    for record in records:
        time, number, history = record.split()
        infos[number].append(time)

    for key in infos.keys():
        total = 0

        for i in range(0, len(infos[key]), 2):
            if i + 1 < len(infos[key]):
                time = (int(infos[key][i + 1].split(":")[0]) * 60 + int(infos[key][i + 1].split(":")[1])) - (
                            int(infos[key][i].split(":")[0]) * 60 + int(infos[key][i].split(":")[1]))
                total += time
            else:
                time = 1439 - (int(infos[key][i].split(":")[0]) * 60 + int(infos[key][i].split(":")[1]))
                total += time

        if total < fees[0]:
            answer.append((key, fees[1]))
        else:
            fee = math.ceil((total - fees[0]) / fees[2]) * fees[3]
            answer.append((key, fees[1] + fee))

    answer = sorted(answer, key=lambda x: x[0])
    return [x[1] for x in answer]