알고리즘 | Algorithm

프로그래머스 | 2022 KAKAO BLIND RECRUITMENT > 주차 요금 계산 - 파이썬

개발자R 2022. 5. 10. 23:34
반응형

문제는 어렵지 않다.

차근차근 풀면 어떻게든 풀 수 있는 문제.

다만 코드를 짜다보니 점점 더러워지는 나의 코드....ㅜㅜ

 

문제 설명

주차장의 요금표와 차량이 들어오고(입차) 나간(출차) 기록이 주어졌을 때, 차량별로 주차 요금을 계산하려고 합니다. 아래는 하나의 예시를 나타냅니다.

만약 출차기록이 없다면 23:59에 나간 것으로 간주한다.

기본요금 적용 시간보다 적은 시간 머물렀다면 당연히 기본요금으로 매긴다.

단위시간이 10분인데 8분 머물렀다면 10분으로 간주한다.

 

상식적인 주차요금을 계산하면 된다.

 

아래는 내가 짠 코드... (더러움 주의ㅜㅜ)

import math
def solution(fees, records):
    answer = []
    dic = {}
    #key: number, value: {minute: 0, in_time: ""}
    min_time, min_fee, std_time, std_fee = fees
    for record in records:
        timestamp, number, flag = record.split()
        if flag == "IN":
            if number in dic :
                dic[number]["in_time"] = timestamp
            else:
                dic[number] = {"minute": 0, "in_time": timestamp, "fee": 0}
        else:
            dic[number]["minute"] += calculate(dic[number]["in_time"], timestamp)
            dic[number]["in_time"] = ""

    for number in dic:
        if dic[number]["in_time"] != "" :
            dic[number]["minute"] += calculate(dic[number]["in_time"], "23:59")
        total_time = dic[number]["minute"]
        #기본요금보다 안나온 경우
        if total_time <= min_time :
            dic[number]["fee"] = min_fee
        #초과한 경우
        else:
            dic[number]["fee"] = min_fee + (math.ceil((total_time - min_time) / std_time)) * std_fee
    numbers = sorted(dic.keys())
    for number in numbers :
        answer.append(dic[number]["fee"])
    return answer

def calculate(intime, outtime):
    in_h, in_min = intime.split(":")
    out_h, out_min = outtime.split(":")
    value = int(out_h)* 60 + int(out_min) - (int(in_h) * 60 + int(in_min))
    return value

 

from collections import defaultdict

을 자꾸 까먹어서 딕셔너리 만드는데 if 를 한층 쌓게 된다 ㅜㅜ

다음엔 꼭!! 꼭 사용해야지.

 

다른사람 풀이를 보니까 class를 이용했다.

나처럼 dic을 만드는 것보다 그 자체를 class로 만들면 더 좋을 것 같다!

 

 

반응형