본문 바로가기

Coding test

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

소스코드

def solution(fees, records):
    answer = []
    parking = dict()
    feeTotal = dict()
    for record in records:
        recordToList = record.split(" ")
        if recordToList[2] == "IN":
            parking[recordToList[1]] = recordToList[0]
        elif recordToList[2] == "OUT":
            if recordToList[1] in feeTotal :
                feeTotal[recordToList[1]] += calculateTime(parking[recordToList[1]],recordToList[0])
            else :
                feeTotal[recordToList[1]] = calculateTime(parking[recordToList[1]],recordToList[0])
            del parking[recordToList[1]]
    for remain in parking :
        if str(remain) in feeTotal :
            feeTotal[str(remain)] += calculateTime(parking[remain],"23:59")
        else : 
            feeTotal[str(remain)] = calculateTime(parking[remain],"23:59")
    feee = sorted(feeTotal)

    for fee in feee:
        answer.append(calFee(feeTotal[fee],fees))

    return answer

def calculateTime(inTime,outTime):
    inTimeHour = inTime.split(':')
    outTimeHour = outTime.split(':')
    inMin = int(inTimeHour[0]) * 60 + int(inTimeHour[1])
    outMin = int(outTimeHour[0]) * 60 + int(outTimeHour[1])
    return outMin - inMin

def calFee(time,fees):
    if time < fees[0]:
        return fees[1]
    else :
        if (time - fees[0]) % fees[2] != 0 :
            feeee = fees[1] + ((time - fees[0])//fees[2]+1) * fees[3]
        else :
            feeee = fees[1] + ((time - fees[0])//fees[2]) * fees[3]
        return feeee   


알고리즘

주어진 입력값을 가지고 class를 만들지 아님 위와 같이할지 고민이었다.

위와 같이 딕셔너리를 사용한 것은 값을 찾을 때 조금이라도 시간을 줄이기 위해서였다.

 

1. 차량 번호는 고유하므로 key, 시간은 value로 설정해주기

2. 만약 입차 상태였으면 새롭게 추가, 출차 상태면 요금정산에 추가(차량번호 : 시간) 후 출차

3. 입차인데 나간 차가 없으면 23:59로 출차처리

4. 차량번호가 낮은 순서대로 정렬 후 fees에 있는 기준대로 정산