[Programmers][Py] 주차 요금 계산

mj·2024년 9월 24일
0

코딩테스트문제

목록 보기
49/50
post-custom-banner

문제

문제 바로가기



나의 풀이

나의 알고리즘

1. 딕셔너리 만들기

{차량번호 : [시각배열] 형식으로 딕셔너리를 생성한다.
시각은 오름차순으로 정렬되어있다.

dict = {'0000': ['06:00', '06:34', '18:59'] }

2. 주차 시간 계산하기

차량 번호가 작은 자동차부터 청구할 주차 요금을 차례대로 정수 배열에 담아서 return해야한다.
따라서, 차량번호가 작은 자동차부터 주차시간과 요금을 계산하고 순서대로 answer 리스트에 넣어 최종결과answer를 반환한다.


출차하지 않은 자동차 전처리

출차하지 않은 자동차의 경우, 시각배열times의 길이는 홀수가 된다. (IN, OUT이 한 쌍으로 출차하지 않으면 홀수개가 된다.)
e.g.) ['06:00', '06:34', '18:59']

이 경우, 마지막 출차시간을 23:59로 간주하므로 배열의 끝에 23:59을 추가해준다.
e.g.) ['06:00', '06:34', '18:59', '23:59']


주차 시간 계산하기
시각배열times[IN시각1, OUT시각1, IN시각2, OUT시각2...] 으로 이루어져있으므로 차량별 누적 주차시간은 다음과 같이 구할 수 있다.

차량별 누적 주차시간 = (OUT시각1 - IN시각1) + (OUT시각2 - IN시각2) + ...

3. 요금 계산하기

위에서 구한 차량별 누적 주차시간에 대한 주차시간을 계산하고 그 값을 answer에 순서대로 추가한다.



전체 코드


import math

def timeToMin(time):
    h, m = map(int, time.split(':'))
    return h*60 + m


def solution(fees, records):
    MAX_TIME = '23:59'
    answer = []
    dict = {}
    
    # 1. 딕셔너리 만들기 {차량번호 : [시각배열]}
    for record in records:
        time, carnum, inout = record.split(' ')
        if carnum in dict:
            dict[carnum].append(time)
        else:
            dict[carnum] = [time]
    
    
    carnums = sorted(dict.keys()) #['0000', '1234' ....]
    for carnum in carnums:

        # 2. 주차시간 계산하기
        times = dict[carnum] #['06:00', '06:34', '18:59']
        length = len(times)
        sum = 0
        if length % 2 != 0: #홀수개이면 출차된 내역이 없다는 뜻이므로 '23:59'출차로 간주
            times.append(MAX_TIME)
            
        for i in range(0, length, 2):
                sum += timeToMin(times[i+1]) - timeToMin(times[i])
            
        
        # 3. 요금계산
        if sum > fees[0]:
            fee = fees[1] + math.ceil((sum - fees[0]) / fees[2]) * fees[3]
        else:
            fee = fees[1]
        answer.append(fee)
            
    
    return answer



고민했던 점

1. 주차시간 계산

  • 분으로 변환하여 계산
  • date time객체를 사용하여 계산

date time객체로 변환하여 -연산을 하면 date time객체가 리턴된다. 따라서 다시 분 단위로 바꿔줘야하는 불편함이 있어서 첫번째 방법을 선택했다.

2. 차량의 IN, OUT 시각 데이터 자료구조
차량별 출차 시간을 오름차순으로 정렬하면 당연히 IN, OUT, IN, OUT ... 순서대로 정렬될 수 밖에 없다.

3. 차량번호 순서대로 요금을 배열에 담는 방법

  • {차량번호 : 요금} 딕셔너리 생성 → keys()를 정렬한 순서대로 요금 담기
  • 차량번호 순서대로 요금계산 → 계산한 순서대로 요금을 배열에 담기

이 문제에서 구하는것은 각 차량번호에 대한 요금이 아니라 차량번호순으로 정렬한 "요금배열"이므로 두번째 방법을 선택했다.

profile
일단 할 수 있는걸 하자.
post-custom-banner

0개의 댓글