sm 기술 블로그

주차 요금 계산(2022 KAKAO BLIND RECRUITMENT) - 파이썬 본문

문제/프로그래머스_파이썬

주차 요금 계산(2022 KAKAO BLIND RECRUITMENT) - 파이썬

sm_hope 2022. 10. 19. 19:42
import math

def feesCal(fees, time):
    if(time < fees[0]):
        return fees[1]
    return fees[1] + math.ceil(((time - fees[0]) / fees[2])) * fees[3]

def timeCal(recordsSplit):
    totalTime = dict()
    for i in recordsSplit:
        tmp = list(map(int, i[0].split(":")))
        if(i[2] == "IN"):
            try:          
                totalTime[i[1]][1] += (tmp[0]*60 + tmp[1])
                totalTime[i[1]][2] = 1
            except:
                totalTime[i[1]] = [0,(tmp[0]*60 + tmp[1]), 1]
        else :
            totalTime[i[1]][0] += abs(totalTime[i[1]][1] - (tmp[0]*60 + tmp[1])) 
            totalTime[i[1]][1] = 0
            totalTime[i[1]][2] = 0

    for j in totalTime:
        if(totalTime[j][2] == 1):
            totalTime[j][0] += abs(totalTime[j][1] - (23*60 + 59))
            totalTime[j][1] = 0
            totalTime[j][2] = 0
    return sorted(totalTime.items())


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

    recordsSplit = list(i.split(" ") for i in records)
    classification = timeCal(recordsSplit)

    for i in classification:
        answer.append(feesCal(fees, i[1][0]))

    return answer

문제요약

주차 요금을 구하자.

 

설명

문제를 딕셔너리 접근으로 많이해서.. 잘푸는건지는 모르겠다.

뭐 맞으면 됐겠지...

 

 

시간을 뽑아내는 메소드

def timeCal(recordsSplit):
    totalTime = dict()
    for i in recordsSplit:
        tmp = list(map(int, i[0].split(":")))
        if(i[2] == "IN"):
            try:          
                totalTime[i[1]][1] += (tmp[0]*60 + tmp[1])
                totalTime[i[1]][2] = 1
            except:
                totalTime[i[1]] = [0,(tmp[0]*60 + tmp[1]), 1]
        else :
            totalTime[i[1]][0] += abs(totalTime[i[1]][1] - (tmp[0]*60 + tmp[1])) 
            totalTime[i[1]][1] = 0
            totalTime[i[1]][2] = 0

    for j in totalTime:
        if(totalTime[j][2] == 1):
            totalTime[j][0] += abs(totalTime[j][1] - (23*60 + 59))
            totalTime[j][1] = 0
            totalTime[j][2] = 0
    return sorted(totalTime.items())

-1-

["00:00 1234 IN"]

다음과 같이 입력이 되기 때문에 split으로 쪼개주었고

시간은 : 을 기준으로 쪼개주었다.

 

-2-

분단위로 계산하기 위해서 시간에는 * 60을 해주었다.

 

-3-

딕셔너리에 다음과 같이 저장 할 것이다.

{"1234" :  [전체시간, 입차시간, 입차여부] }

 

입차여부에서

입차 : 1

출차 : 0

으로 처리해주었다.

 

전체시간과 입차시간을 따로 둔 이유는

출차를 했을 때 절대값(입차 - 출차)이고 전체시간에 더해주기 위해서이다.

 

 

-4-

결과를 보면 차량번호 순으로 결과가 출력되는것을 볼 수 있다.

때문에 sort를 통해 오름차순 정렬을 진행하였다.

 

 

요금 계산 메소드

def feesCal(fees, time):
    if(time < fees[0]):
        return fees[1]
    return fees[1] + math.ceil(((time - fees[0]) / fees[2])) * fees[3]

 

기본 시간 이내이면 기본요금 그게 아니라면 문제에 나와있는대로 작성해 주었다.

 

 

솔루션 메소드

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

    recordsSplit = list(i.split(" ") for i in records)
    classification = timeCal(recordsSplit)

    for i in classification:
        answer.append(feesCal(fees, i[1][0]))

요금, 시간 메소드를 연결 시켜준 것 이다.

 

 

 

 

 

Comments