본문 바로가기
개인 공부/알고리즘 트레이닝

[python] programmers - 주차 요금 계산

by 아메리카노와떡볶이 2022. 9. 11.
728x90
programmers - 주차 요금 계산

https://school.programmers.co.kr/learn/courses/30/lessons/92341

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

상세 설명은 위의 링크를 참조하세요.

 

문제설명

입출력 예를 보면 바로 알 수 있듯이, 주차장의 차량 별 이용기록을 records 배열을 통해 받고 그 기록을 통해 각 차량 별 요금을 계산하는 문제이다.

사실 문제를 이해하는 것은 그렇게 어렵지않은데 이런 구현 문제는 쫌 꼼꼼하게 풀어야 시간을 줄일 수 있다. 

위처럼 문제를 읽으면서, 대충 어떻게 풀어야할지 정리하면 정리한 내용을 토대로 구현할 수 있어서 헤매지않고 한번에 풀기 좋다.

주의해야할 조건은 출차시각이 없는 차량인데, 입차시각 체크할때 출차시각을 0으로 설정하는 방법을 통해 해결했다.

 

문제풀이코드

import math
def solution(fees, records):
    #fees = [ 기본시간, 기본 요금, 단위 시간, 단위 요금 ]
    
    # dictionary 자료형 설정
    arrival_time = {}
    departure_time = {}
    total_parking_time = {}
    total_parking_fee = {}
    
    # park record parsing
    for record in records:
        rec = record.split(',')
        rec = record.split(' ')
        
        # 시각 , 차량번호, 인아웃 내역 parsing
        cha_time = rec[0]
        cha_num = rec[1]
        inout = rec[2]
        
        if inout =='IN':
            arrival_time[cha_num] = cha_time
            #입차할때 출차시각 0으로 설정
            departure_time[cha_num] = 0
            
        elif inout == 'OUT':
            departure_time[cha_num] = cha_time
            
            # 이번 입출차때 이용한 주차시간 계산
            in_time = arrival_time[cha_num].split(':')
            res1 = int(in_time[0]) * 60 + int(in_time[1])
            
            out_time = departure_time[cha_num].split(':')
            res2 = int(out_time[0]) * 60 + int(out_time[1])
            res3 = res2 - res1
            
            if cha_num in total_parking_time:
                total_parking_time[cha_num] += res3
            else:
                total_parking_time[cha_num] = res3
            
            print("차량번호 >>" + cha_num +"의 현재 누적 주차시간 >> "+ str(total_parking_time[cha_num]))
    
    # 출차시간기록이 없는 차량 체크
    for key,value in departure_time.items():
        if value == 0:
            res2 = 23 * 60 + 59
            in_time = arrival_time[key].split(':')
            print(in_time)
            res1 = int(in_time[0]) * 60 + int(in_time[1])
            res3 = res2 - res1
            print(key,res2,res1)
            if key not in total_parking_time:
                total_parking_time[key] = res3
            else:
                total_parking_time[key] += res3
    # 요금 계산하기
    for key,value in total_parking_time.items():
        print("차량번호 >>> "+key+"의 이용 시간 >>>"+str(value))
        if value <= fees[0]:
            total_parking_fee[key] = fees[1]
        else:
            total_parking_fee[key] = fees[1] + math.ceil(((value-fees[0])/fees[2])) * fees[3]
    # 요금 계산하기
    for key,value in total_parking_fee.items():
        print(key,value)
        
    sorted_dict = sorted(total_parking_fee.items())
    answer = []
    for dic in sorted_dict:
        answer.append(dic[1])
    
    return answer

 

알게된 점

1. math 모듈의 ceil 메소드를 통해 소수 올림을 쉽게 할 수 있다.

2. 복잡해보이는 구현 문제는 바로 코드를 쓰지말고 메모장을 켜보자 

 

728x90

댓글