📖 2022 KAKAO BLIND RECRUITMENT > 주차 요금 계산
📖What I thought
- 크게 2단계로 진행된다고 판단 (1.
records기록 정보를 내가 활용할 수 있는 데이터 구조로 변경 2. 해당 데이터로 요금을 계산)
- “
records기록 정보를 내가 활용할 수 있는 데이터 구조로 변경” 단계에서 해야 할 일- 반복문 돌면서 기록 정보 문자열 쪼개서 내가 쓸 수 있는 변수로 둬
- 입/출차 시간 정보를 모두 분 단위 값으로 환산
- 누적 주차 정보 시간 갱신 (입차 시간: - 출차 시간: +)
- “해당 데이터로 요금을 계산” 단계에서 해야할 일
- 기록되지 않은 23:59 출차 정보 존재 시 계산
- 기본 요금 계산
- 기본 요금 계산 후 남은 시간이 있다면 단위 시간으로 요금을 계산
- 출력 조건 맞추기
- 얻은 최종 요금 정보들 차량 번호 작은 순으로 정렬
- 최종 요금 정보만 리스트에 담아 출력
📖풀이
📎구현
from math import ceil
def solution(fees, records):
basic_time, basic_fee, unit_time, unit_fee = fees # 요금표
parking_lot = dict() # [key : value] = [차량 번호 : 누적 주차 시간]
not_recorded = 23*60 + 59 # 출차 기록 X
fee_info = [] # 청구 요금
# record parking info
for record in records:
time, car_num, inout = record.split()
# change time(h:m) to minute
h, m = map(int, time.split(":"))
time = -(h * 60 + m) if inout == "IN" else (h* 60 + m)
parking_lot[car_num] = parking_lot.get(car_num, 0) + time
# calculate fee
for car, time in parking_lot.items():
fee = 0
# not recorded 23:59
if time <= 0:
time += not_recorded
# calculate basic time & fee
time = time - basic_time
fee += basic_fee
# calculate remaining fee
if time > 0:
fee += ceil(time/unit_time) * unit_fee
fee_info.append((car, fee))
# sort with the smallest car num
fee_info = sorted(fee_info, key=lambda x: x[0])
return [f for c, f in fee_info]📖What I learned
- 올림 함수 : ceil(v) (from math import ceil) (아니면 import math해서 math.ceil(v))
- 예외처리를 잘하자 코테에선 테케가 많이 안 주어지니까 특수상황의 테케도 평소 생각해보는 습관을 길러야 할 듯!!!
⭐️기록되지 않은 23:59의 출차 처리
첫 생각
이전 입/출차 기록이 어떻든 마지막 출차 기록이 없다면(최종 출차가 없고 입차가 마지막 기록이라면) 누적 주차 시간이 마이너스 → 조건문을 누적 주차 시간이 마이너스이거나 입차 기록만 있는 상황(records의 길이가 1)일 때로 한정함
테케로 얻은 힌트
근데??? 입차 시간이00:00인 정보만 존재하는 테케에서 걸렸어 → 해당 조건문대로면 얜 기본 요금만 내고 나가 하루 웬종일 주차했는데 ;;; → 어떤 입/출차 기록을 가졌든 누적 주차 시간이 0일 수는 없어. 절.대.로. 그러니까? 굳이 다른 조건을 더 따지지 않아도 누적 주차 시간이 0보다 작으면 ??? 마지막 출차 정보가 없는 것