[프로그래머스] 주차 요금 계산

Turtle·2024년 9월 5일
0
post-thumbnail

🗃️문제 설명

주차장의 요금표와 차량이 들어오고(입차) 나간(출차) 기록이 주어졌을 때, 차량별로 주차 요금을 계산하려고 합니다. 아래는 하나의 예시를 나타냅니다.

  • 요금표

  • 입/출차 기록

  • 자동차별 주차 요금

  • 어떤 차량이 입차된 후에 출차된 내역이 없다면, 23:59에 출차된 것으로 간주합니다.
    • 0000번 차량은 18:59에 입차된 이후, 출차된 내역이 없습니다. 따라서, 23:59에 출차된 것으로 간주합니다.
  • 00:00부터 23:59까지의 입/출차 내역을 바탕으로 차량별 누적 주차 시간을 계산하여 요금을 일괄로 정산합니다.
  • 누적 주차 시간이 기본 시간이하라면, 기본 요금을 청구합니다.
  • 누적 주차 시간이 기본 시간을 초과하면, 기본 요금에 더해서, 초과한 시간에 대해서 단위 시간 마다 단위 요금을 청구합니다.
    • 초과한 시간이 단위 시간으로 나누어 떨어지지 않으면, 올림합니다.
    • ⌈a⌉ : a보다 작지 않은 최소의 정수를 의미합니다. 즉, 올림을 의미합니다.

주차 요금을 나타내는 정수 배열 fees, 자동차의 입/출차 내역을 나타내는 문자열 배열 records가 매개변수로 주어집니다. 차량 번호가 작은 자동차부터 청구할 주차 요금을 차례대로 정수 배열에 담아서 return 하도록 solution 함수를 완성해주세요.

🖥️코드

def solution(fees, records):
    
    # 시간을 보기 편하게 분으로 환산
    def to_min(time):
        time = time.split(':')
        return int(time[0]) * 60 + int(time[1])

    parked = dict()         # 차량 번호 : 입/출차
    parked_time = dict()    # 차량 번호 : 주차 시간 
    for record in records:
        time, number, type = record.split(' ')
        
        # 입차
        if type == "IN":
            parked[number] = to_min(time)
        # 출차
        else:
            parked_duration = to_min(time) - parked[number] # 주차 시간
            if number in parked_time:                       # 이전에 입차하고 출차한 이력이 있다면
                parked_time[number] += parked_duration      # 주차 시간 더해주기
            else:                                           # 이번에 처음 입차하고 출차했다면
                parked_time[number] = parked_duration       # 주차 시간 저장
            del parked[number]                              # 출차했으므로 키 제거
    
    for number, type in parked.items():                     
        parked_duration = (23 * 60 + 59) - parked[number]   # 입차하고 출차하지않았다면 23시 59분에 출차한 것으로 간주
        if number in parked_time:                           
            parked_time[number] += parked_duration          # 주차 시간 기록에 이미 있는 차량이라면 더해준다.
        else:
            parked_time[number] = parked_duration           # 주차 시간 기록에 없는 차량이면 주차 시간 저장
    
    parked_time = sorted(parked_time.items())               # 차량 번호가 작은 순서대로 정렬
    
    # 누적 주차 시간이 기본 시간 이하라면 기본 요금 청구
    # 누적 주차 시간이 기본 시간을 초과하면 기본 요금에 더해서 초과한 시간에 대해 단위 시간 마다 단위 요금을 청구
    result = []
    for number, total_time in parked_time:
        if total_time <= fees[0]:
            result.append(fees[1])
        else:
            extra_time = total_time - fees[0]
            extra_fee = (extra_time + fees[2] - 1) // fees[2] * fees[3]
            total_fee = fees[1] + extra_fee
            result.append(total_fee)
    return result

👉엄청난 고차원적인 알고리즘을 요구하지 않았지만 수많은 조건을 만족시켜야 한다는 점에서 상당한 시간이 소요되었다.
👉읽기 역시도 중요...하다

🔒문제 출처

프로그래머스 - (2022 KAKAO BLIND RECRUITMENT) 주차 요금 계산

0개의 댓글