https://programmers.co.kr/learn/courses/30/lessons/92341?language=python3 

 

코딩테스트 연습 - 주차 요금 계산

[180, 5000, 10, 600] ["05:34 5961 IN", "06:00 0000 IN", "06:34 0000 OUT", "07:59 5961 OUT", "07:59 0148 IN", "18:59 0000 IN", "19:09 0148 OUT", "22:59 5961 IN", "23:00 5961 OUT"] [14600, 34400, 5000]

programmers.co.kr

 


풀이 과정


본문이 너무 길어서 내가 이해한게 맞나 자주 확인해보아야 했던 문제 같다.

  1. 시간을 처리할 때는 그냥 분으로 모두 바꿔준 다음에 처리해주는게 체감상 제일 좋다. 따라서 시-분으로 구성되어 있는 형태를 분으로 바꾸어주는 함수를 만들어 준다.
  2. 이후, 입력된 기록에 맞추어서 다음 과정을 반복한다.
    1. 전체 주차 시간을 저장해 둘 딕셔너리를 따로 만들어 둔다.
    2. IN 표시가 되어있는 경우는, 해당 차의 주차 시간을 딕셔너리에 저장한다.
    3. OUT 표시가 되어 있는 경우는, 출차 시간에서 딕셔너리에 저장된 주차 시간을 빼준 값을 전체 주차 시간을 저장해 둘 딕셔너리에 더해 준다. 또한 이 때, OUT이 되었음을 나타내기 위해 값을 -1로 처리해 준다.
  3. 위 과정을 끝내고 나서, OUT 처리가 되지 않은 경우는 23:59에 출차한 것으로 간주하여 처리해 준다.
    • (값이 -1이 아닌 경우)
  4. 마지막으로, 주차 요금을 구해 준다.
    1. 차량 번호순으로 구해주어야 하므로 처음부터 딕셔너리의 키값을 정렬해서 진행하는게 편하다.
    2. 기본 시간보다 작거나 같은 경우는 기본 요금으로 처리해 준다.
    3. 기본 시간보다 크다면 다음 수식을 적용해준다.
      1. 기본 요금 + math.ceil((주차 시간 - 기본 시간) / 단위 시간) * 단위 요금
      2. 올림 기호를 사용하는 법을 모르므로 math.ceil로 표시함..ㅎㅎ

소스 코드


from collections import defaultdict
import math

def htom(s):
    return 60 * int(s[:2]) + int(s[3:])


def solution(fees, records):
    answer = []
    park_time = defaultdict(lambda: 0)
    in_time = defaultdict(lambda: 0)
    for record in records:
        time, number, status = record.split()
        if status == 'IN':
            in_time[number] = htom(time) 
        if status == 'OUT':
            park_time[number] += htom(time) - in_time[number]
            in_time[number] = -1
    
    last_time = htom("23:59")
    default_time, default_fee, per_minute, per_fee = fees
    for key in sorted(in_time.keys()):
        if in_time[key] != -1:
            park_time[key] += last_time - in_time[key]
        if park_time[key] <= default_time:
            answer.append(default_fee)
        else:
            answer.append(default_fee + (
                math.ceil((park_time[key] - default_time) / per_minute)
            ) * per_fee)
    
    
    
    return answer

+ Recent posts