문제
- fees: 주차 요금 (fees의 길이 = 4)
- fees[0]: 기본 시간(분)
- fees[1]: 기본 요금(원)
- fees[2]: 단위 시간(분)
- fees[3]: 단위 요금(원)
- records: 자동차의 입/출차 내역 (1 ≤ records의 길이 ≤ 1,000)
- 시각, 차량번호, 내역
풀이 과정
풀이 시간: 20분
알고리즘: 단순구현
1. 'HH:MM' 형태의 시간을 모두 분 단위로 변환후 cars 딕셔너리에 '차 번호': [입차시간, 출차시간] 형태로 저장
2. 출차 기록이 없는 경우 처리(입/출차의 기록이 홀수라면 출차하지 않은 상황) -> 23:59분을 분 형태로 추가
3. 입출차 기록에서 누적 주차 시간을 구한 후, 누적 주차 요금을 계산한다.
시간 복잡도: O(NlogN) ← 전체 코드 중 정렬이 가장 많은 시간이 소요됨
코드
import math
from typing import List
def solution(fees: List, records: List) -> List:
"""
fees: 주차요금
records: 자동차 입/출차내역
"""
answer = [] # 차량번호가 작은 자동차부터 청구할 주차 요금
basic_time, basic_fee, unit_time, unit_fee = fees
# 전체 차량(차 번호: [입차시간, 출차시간])
cars = {}
for record in records:
time, num, status = record.split()
time = int(time[:2]) * 60 + int(time[3:]) # 시간을 분 단위로 변환
if num not in cars:
cars[num] = []
cars[num].append(time)
# 출차 기록이 없으면 23:59에 출차된 것으로 간주
for car, times in sorted(cars.items()):
if len(times) % 2 != 0: # 입/출차 내역이 홀수이면 출차를 하지 않은 것
cars[car].append(24*60-1)
minutes = 0 # 누적 주차 시간(분)
while times:
out_time = times.pop() # 출차 시간
in_time = times.pop() # 입차 시간
minutes += out_time - in_time
# 누적 주차 요금
if minutes <= basic_time: # 기본시간 이하 -> 기본 요금
total_fee = basic_fee
else: # 기본 요금 + 단위 요금
total_fee = basic_fee + math.ceil((minutes - basic_time) / unit_time) * unit_fee
answer.append(total_fee)
return answer
'PS > Programmers' 카테고리의 다른 글
[Level 3] 표현 가능한 이진트리(Python) (0) | 2024.06.08 |
---|---|
[Level 2] 혼자서 하는 틱택토(Python) (0) | 2024.06.02 |
[Level 3] 단어 변환(Python) (1) | 2023.09.07 |
[Level 2] 더 맵게(Python) (0) | 2023.09.07 |
[Level 2] [3차] n진수 게임(Python) (0) | 2023.09.06 |