본문 바로가기
기술/Problem Solving

[Programmers] 주차 요금 계산

by 팡팡구리 2022. 1. 17.
반응형

출처


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

 

코딩테스트 연습 - 주차 요금 계산

[180, 5000, 10, 600] ["05:34 5961 IN", "06:00 0000 IN", "06:34 0000 OUT", "07:59 5961 OUT", "07:59 0148 IN", "18:59 0000 IN", "19:09 0148 OUT", "22:59 5961 IN", "23:00 5961 OUT"] [14600, 34400, 5000]

programmers.co.kr

 

 

문제


 

 

제한사항


 

 

풀이 및 코드


문제 조건대로 따라 구현만 하면 되는 문제이다.

문자열을 어떻게 처리하느냐에 따라 스타일이 달라질 것 같다.

각각의 차번호를 key로 , 입/출차 시간을 분단위로 바꾼 값을 value로 쓰기 위해 defaultdict를 사용했다.

 

  1. 차량 번호 : [ 입출차 시간 ] 형식으로 담을 defaultdict 선언
  2. 차량 번호가 작은 자동차부터 return하라는 조건에 따라 차량 번호를 기준으로 정렬
  3. YY:MM 형식으로 된 시간을 분단위로 변환하여 삽입
    1. IN(입차)일 경우, -를 붙이고
    2. OUT(출차)일 경우, 그대로 삽입
  4. dictionary를 돌면서 주차 요금 계산, 이 때 value가 홀수개면(마지막 출차 기록이 없으면) 23:59분을 OUT으로 간주하고 계산

 

import math
from collections import defaultdict

def solution(fees, records):
    dTime, dFee, uTime, uFee = fees[0], fees[1], fees[2], fees[3]
    parkingDict = defaultdict(list)
    
    records.sort(key=lambda x:x.split(" ")[1])	// 차 번호를 기준으로 정렬
    
    for record in records:
        ioTime, car, io = record.split(" ")
        hour, minute = map(int, ioTime.split(":"))
        if io == "IN":
            parkingDict[car].append(-(hour*60 + minute))
        else:
            parkingDict[car].append(hour*60 + minute)
    
    answer = []
    for carNum in parkingDict:
        if len(parkingDict[carNum])%2 == 0:
            pTime = sum(parkingDict[carNum])
        else:	// 출차 기록이 없을 경우 23:59분을 출차로 간주
            pTime = sum(parkingDict[carNum]) + (23 * 60 + 59)
        if pTime <= dTime:
            answer.append(dFee)
        else:
            answer.append(dFee + math.ceil((pTime - dTime)/uTime) * uFee)
    return answer