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

WJ·2023년 4월 16일

코딩테스트 대비

목록 보기
6/8
post-thumbnail

문제

코딩테스트 연습 - 2022 KAKAO BLIND RECRUITMENT - 주차요금 계산

문제 설명


제한사항

🧭 접근

제한사항에 따라 동일한 차량이 또 입차하거나 없는 차량이 출차되는 경우, 입력 시각이 잘못된 경우 와 같이 잘못된 입력이 없으므로,
단순히 차량의 입차시 시간, 출차시 시간만을 계산하였다.

✔ 풀이

  1. records 의 문자열을 시각, 차량번호, 내역 으로 파싱, 시각은 분 단위로 변환
  2. 내역이 IN인경우 딕셔너리에 차량번호를 key로 하여 입차시간, 누적시간, 입차여부 저장, 내역이 OUT인 경우 현재시간과 입차시간을 비교하여 누적시간 증가 시킴
  3. 종료시각까지 출차하지 않은 경우 종료시각과 입차시간 비교하여 누적시간 증가
  4. 차량번호가 작은 순서대로 요금을 배열에 담아야 하므로 차량번호 기준으로 정렬 후,
    누적시간이 기본시간보다 작거나 같은경우 기본요금, 초과인 경우 요금 계산식에 따라 계산 후 배열에 추가 후에 return

📙 소스 코드

import math

def solution(fees, records):
    def_time = fees[0]; def_fee = fees[1]; over_time = fees[2]; over_fee = fees[3]
    table = {}
    
    for r in records:
        time, car_num, order = r.split() # 시간, 차량번호, 내역
        h, m = map(int,time.split(':'))
        t = (h*60) + m 
        if order == 'IN': 
            if car_num not in table:
                table[car_num] = [t,0,True] # 입차시간,누적시간,입차여부
            else:
                table[car_num][0] = t # 입차시간
                table[car_num][2] = True # 입차
        elif order == 'OUT':
            prev_t = table[car_num][0];
            use_time = t - prev_t # 현재시간 - 입차시간
            table[car_num][1] += use_time 
            table[car_num][2] = False # 출차
    
    
    last_time = (23*60) + 59
    # table 입차시간,누적시간,입차여부
    for key, t in table.items():
        if t[2] == True: # 종료까지 출차 안했을때
            table[key][1] += last_time-t[0]
    
    s_table = dict(sorted(table.items(),key=lambda x:x[0])) # 차량번호 기준 정렬
    res = []

    for t in s_table.values():
        if t[1] <= def_time:
            res.append(def_fee)
        else:
            fee = def_fee + math.ceil((t[1] - def_time) / over_time) * over_fee # 기본 요금 + 주차시간에 따른 요금 
            res.append(fee)
        

    return res

🤔 느낀 점

이러한 문자열 처리 문제들이 코딩테스트 1번으로 자주 나오는데, 이런 문제의 경우 제한사항을 다른 문제보다 꼼꼼히 확인한 후 풀어야겠다 느꼈고, 코드가 가독성이 많이 떨어짐.. 해결 방법을 찾아봐야겠다.

profile
주니어 개발자

0개의 댓글