프로그래머스 : 주차 요금 계산 (python)

2022 KAKAO BLIND RECRUITMENT 주차 요금 계산


문제 링크

https://programmers.co.kr/learn/courses/30/lessons/92341
문제가 길어 문제를 읽고 이해한 후, 밑의 글을 읽으면 좋을거 같습니다.

전체 코드

import math

def dateToMinutes(date):
    h, m = map(int, date.split(':'))
    return h*60 + m
    
def solution(fees, records):
    answer = []

    # 기본 시간, 기본 요금, 단위 시간, 단위 요금 순
    dt, df, ut, uf = fees
    
    dic = dict()

    for r in records:
        time, number, history = r.split()
        number = int(number)
        
        if number in dic:
            dic[number].append([dateToMinutes(time), history])
        else:
            dic[number] = [[dateToMinutes(time), history]]
    
    rList = list(dic.items())
    rList.sort(key=lambda x : x[0])
    
    for r in rList:
        t = 0

        for rr in r[1]:
            if rr[1] == "IN":
                t -= rr[0]
            else:
                t += rr[0]

        if r[1][-1][1] == "IN":
            t += dateToMinutes('23:59')
        
        if t <= dt:
            answer.append(df)
        else:
            answer.append(df + math.ceil((t-dt) / ut) * uf)        

    return answer

코드 작성시 고민했던 점

  1. 반복적으로 처리하는 부분은 무엇일까
  • 문제에서 차량이 입차되고 출차되는 시각을 HH:MM형식으로 주어진다. 계산을 쉽게 하기위해 dateToMinutes 함수를 통해 분 단위로 환산하여 반환해주었다.
    ex) "05:34" → 334
def dateToMinutes(date):
	h, m = map(int, date.split(':'))
    return h*60 + m
  1. 사용할 자료형에 대한 고민
  • 단순히 리스트를 차량 번호를 조회하면 리스트를 탐색하면서 차량 번호를 매칭하는 별도의 조건문이 필요하므로, 차량 번호 조회시 한번에 그 차량의 입/출차 내역을 조회할 수 있도록 dictionary 자료형을 사용하였다.
dic = dict()

for r in records:
    time, number, history = r.split()
    number = int(number)
    
    if number in dic:
        dic[number].append([dateToMinutes(time), history])
    else:
        dic[number] = [[dateToMinutes(time), history]]
출력 : {5961: [[334, 'IN'], [479, 'OUT'], [1379, 'IN'], [1380, 'OUT']], 0: [[360, 'IN'], [394, 'OUT'], [1139, 'IN']], 148: [[479, 'IN'], [1149, 'OUT']]}
  • dictionary 자료형 사용시 인덱스 접근과 sort() 함수를 사용하지 못하기 때문에, 문제 출력 조건에서 요구하는 차량 번호가 작은 자동차부터 청구할 주차 요금을 차례대로 정수 배열에 담아서 return 하도록 solution 함수를 완성해주세요. 를 만족시키기 어려웠다. 따라서 문제 출력 조건 만족하기 위해 dictionary를 (key, value) 튜플 형태의 list로 변환 후, 차량번호 기준으로 sort()를 하였다.
rList = list(dic.items())
rList.sort(key=lambda x : x[0])
출력 : [(0, [[360, 'IN'], [394, 'OUT'], [1139, 'IN']]), (148, [[479, 'IN'], [1149, 'OUT']]), (5961, [[334, 'IN'], [479, 'OUT'], [1379, 'IN'], [1380, 'OUT']])]

→ 사실상 차량 번호는 문제를 풀기 위해 차량 번호에 따른 순서가 중요하지, 차량번호가 "0000"이든 "0"이든 상관 없기 때문에 string을 int로 변환하여 sort()를 했다.

  1. 입차 이후 출차된 내역이 없는 경우 처리
  • 입차 이후 출차된 내역이 없다라는 것은 각 입/출차 내역의 마지막 내역이 입차(IN)로 끝나는 것이기 때문에, 이 경우 누적 주차 시간 계산할 때 "23:59"를 분으로 환산한 만큼 더해주어 계산했다.
for r in rList:
    # 생략
    ...
    
    if r[1][-1][1] == "IN":
        t += dateToMinutes('23:59')

결과

좋은 웹페이지 즐겨찾기