[카카오] 파이썬 주차요금 계산

Dev.Jo·2022년 2월 26일
0

알고리즘

목록 보기
16/21
post-thumbnail

코드

# 코드
import math

def solution(fees, records):
    cars_park_time = {}
    answer = []
    
    for i in range(len(records)):
        [in_time, in_car_number, in_info] = records[i].split(" ")
        
        # 입차 정보를 찾는다
        if in_info == "IN":
        	# 해당 자동차의 출차 시간을 찾는다
            out_time = get_out_time(in_car_number,i,records)
            park_time = get_park_time(in_time,out_time) 
            
            # 자동차의 주차시간을 누적계산한다
            if in_car_number in cars_park_time:
                cars_park_time[in_car_number] += park_time
            else :
                cars_park_time[in_car_number] = park_time
    
    # 자동차 번호판 오름차순으로 정렬한다
    cars_park_time = sorted(cars_park_time.items())

	# 주차요금을 계산하고 답에 추가한다.
    for (car_number,park_time) in cars_park_time:
        answer.append(get_fee(fees,park_time))
    return answer
                    


# 출차 시각을 찾는다. 만약 없으면 "23:59"에 나간것으로 간주한다
def get_out_time(in_car_number,idx,records):
    for j in range(idx,len(records)):
        [out_time, out_car_number, out_info] = records[j].split(" ")
        if in_car_number == out_car_number and out_info == "OUT":
            return out_time
    return "23:59"

# 주차 시간을 계산한다. 전부 "분"으로 변환후 계산했다.
def get_park_time(in_time,out_time):
    return  (int(out_time[:2]) * 60 + int(out_time[3:])) - (int(in_time[:2]) * 60 + int(in_time[3:]))
        
# 주차 요금을 계산한다
def get_fee(fees,park_time):
    [base_time,base_fee,per_time,per_fee] = fees
    if park_time <= base_time:
        return base_fee
    else:
        return base_fee + math.ceil((park_time-base_time) / per_time) * per_fee

풀이

먼저구해야하는 정보는 자동차의 누적 주차시간이다.

이를 위해 dict {}를 여러 생성해서 각종 정보들을 저장할 수도 있지만, 이중for문을 돌아도 시간복잡도가 크지않은 것 같아 이중for문을 사용했다.

기본적인 풀이 전략은 다음과 같다.

  • records 정보를 순회하면서 입차 정보를 가져오고, 해당 index보다 큰 for문을 순회하면서 출차 정보를 찾는다

코드로 정리하면 다음과 같다.

for i in range(len(records)):
        [in_time, in_car_number, in_info] = records[i].split(" ")
        
        # 입차 정보를 찾는다
        if in_info == "IN":
        	# 해당 자동차의 출차 시간을 찾는다
            out_time = get_out_time(in_car_number,i,records) 

출차시간을 찾을 때 까다로웠던 다음 조건이 까다로웠는데

0000번 차량은 18:59에 입차된 이후, 출차된 내역이 없습니다. 따라서, 23:59에 출차된 것으로 간주합니다.

만약 이중for문을 다돌아도 출차시각을 찾지 못했다면 23:59을 return한다

def get_out_time(in_car_number,idx,records):
    for j in range(idx,len(records)):
        [out_time, out_car_number, out_info] = records[j].split(" ")
        
        # 해당 자동차의 출차 정보라면 출차시간을 return 한다
        if in_car_number == out_car_number and out_info == "OUT":
        return out_time
            
    # 만약 출차 정보를 찾지 못했다면 "23:59"을 return 한다
    return "23:59"

출차 시간을 찾았다면 이후에는 간단하다.
자동차 번호판에 대해 누적해서 주차시간을 더한다.

park_time = get_park_time(in_time,out_time) 
            if in_car_number in cars_park_time:
                cars_park_time[in_car_number] += park_time
            else :
                cars_park_time[in_car_number] = park_time

그리고 자동차 번호판을 오름차순으로 정렬한 후 , 주차요금을 계산한다.

# 자동차 번호판 오름차순으로 정렬한다
    cars_park_time = sorted(cars_park_time.items())

	# 주차요금을 계산하고 답에 추가한다.
    for (car_number,park_time) in cars_park_time:
        answer.append(get_fee(fees,park_time))
    return answer

후기

차근차근 따라가면 어렵지 않은 문제였다.
dict를 정렬하는 방법을 배웠다.
1. dict.items() : key를 기준으로 오름차순으로 정렬후 pair 리스트를 반환한다.

profile
소프트웨어 엔지니어, 프론트엔드 개발자

0개의 댓글