티스토리 뷰

728x90
반응형

문제

차량의 입출차 기록을 통해 차량별 주차요금을 계산하는 문제이다.

주차요금은 요금표를 기준으로 기본 시간에 대한 기본 요금을 부여하고 초과한 경우 단위 시간당 당위 요금이 추가된다.

초과한 시간이 단위 시간으로 나누어 떨어지지 않는다면 올림으로 계산한다.

풀이

  • 입차와 출차가 겹치는 경우가 없고, 입차와 출차 순서가 뒤집히는 경우도 없기 때문에 순차적으로 계산하기만 하면 간단히 주차 시간을 계산할 수 있다.
  • 출차 시간에서 입차 시간을 뺀 값이 주차 시간임으로 총 주차 시간을 계산할 때 차량별로 입차 시간은 빼주고, 출차 시간은 더해주면 된다.
  • 출차 기록이 없는 경우에는 23:59분으로 가정하고 계산해야 한다.
    • 이때 차량의 주차 시간을 통해 출차 기록이 없다는 것을 판단할 수 있다.
    • 입차 시간이 00:00 일 때는 주차 시간이 0, 그 이후 입차했다면 주차 시간이 음수가 된다.
    • 따라서 주차 시간이 0 이하라면 출차 시간을 23:59분로 가정하고 1439분을 더한다.
  • 주차 시간에 대한 요금 계산은 fees의 기본 시간, 기본 요금, 단위 시간, 단위 요금을 사용하면 된다.
    • 주차 요금 = 기본 요금 + 단위 요금 x math.ceil( ( 주차 시간 - 기본 시간 ) / 단위 시간 )
    • 단위 시간에 나누어 떨어지지 않으면 올림으로 계산한다.

Python 코드

import math
from collections import defaultdict

def solution(fees, records):
    answer = []
    base_time, base_fee, unit_time, unit_fee = fees
    parking_info = defaultdict(int)
	
    # 시간 문자열을 분으로 바꾸기
    def to_minutes(x):
        hh,mm = map(int,x.split(":"))
        return hh*60+mm
    
    # 시간에 대한 요금 계산하기
    def calculate_fee(x):
        fee = base_fee		# 기본 요금
        if x > base_time:	# 기본 시간 이상 주차했다면 요금 추가
            extra_time = x - base_time
            fee += math.ceil(extra_time / unit_time) * unit_fee
        return fee

    for record in records:
        hhmm, car_numb, status = record.split()
        # 출차 시간 - 입차 시간
        status = -1 if status == "IN" else 1
        parking_info[car_numb] += to_minutes(hhmm) * status
    
    for car_numb, parking_time in sorted(parking_info.items()): # 차 번호를 기준으로 오름차순
        if parking_time <= 0:	# 출차 기록이 없는 경우
            parking_time += to_minutes("23:59")
        answer.append(calculate_fee(parking_time))

    return answer

 

문제출처

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

 

프로그래머스

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

programmers.co.kr

 

728x90
반응형
댓글