카테고리 없음

2022 KAKAO BLIND RECRUITMENT : 주차 요금 계산

이도울 2023. 11. 13. 19:29
SMALL

너무.. 그지 같이 풀었다..ㅠㅠ

 

1) carDict라는 차의 누적시간, 최근 수정시간, 입출차 정보를 담은 딕셔너리를 선언했다. 그 뒤, records에 있는 차 번호의 정보를 통해 carDict을 초기화 해주었다.

 

2) 한 번 더 records를 순회하면서 carDict의 정보를 업데이트 해주었는데, 시간의 경우에는 : 기준으로 앞은 시간이므로 int()*60을 해주고 뒤의 분을 더해 분 단위로 통일시켰다.

 

3) IN, OUT인지 여부를 기록하고, OUT일 경우에는 최근 IN 시간을 빼고 누적시간에 더했다.

 

4) 그리고 나서 요금을 계산해주는 것이 첫 번째 접근이었는데, 다음 2가지를 고려해주지 못했다.

가. 출차하지 않고 23:59분까지 입차가 되어 있는 차

나. 차의 번호 내림차순대로 answer의 값이 나와야 함

 

5) 가의 경우 다시 한번 carDict을 순회하면서 IN 상태의 경우 1439분(23:59를 분단위로 변환한 것)에서 최근 수정 일자를 뺀 것을 총 누적시간에 더해주어서 해결했다.

 

6) 나의 경우 carDict을 sort한 sortCarDict배열을 키로 반복문을 돌려서 내림차순 차량번호 순으로 answer가 append되도록 했다.

 

7) 만약 기본 시간보다 작거나 같으면 기본 시간만 부과하고,

 

8) 기본 시간보다 크다면 누적 시간에 기본시간을 빼고 시간 단위로 나눈 뒤(값을 올림 ceil), 그 나눈 값을 단위 요금을 곱한 후, 기본 요금을 더해주었다.

 

기본 요금 + (올림(누적시간 - 기본시간) / 시간 단위) * 단위 요금

from collections import defaultdict
import math

def solution(fees, records):
    
    carDict = defaultdict(list)
    for i in records:
        a = i.split(" ")
        carDict[a[1]] = [0, 0, 0]

    for i in records:
        a = i.split(" ")
        tmpCar = carDict[a[1]]
        time = a[0].split(":")
        timeAmount = int(time[0]) * 60 + int(time[1])
        if(a[2] == "IN"):
            carDict[a[1]] = [tmpCar[0],timeAmount,"IN"]
            
        elif(a[2] == "OUT"):
            carDict[a[1]] = [tmpCar[0]+(timeAmount-tmpCar[1]), timeAmount, "OUT"]
    
    for i in carDict:
        tmpCar = carDict[i]
        if(tmpCar[2] == 'IN'):
            carDict[i] = (tmpCar[0] + 1439 - tmpCar[1], tmpCar[1], "OUT")
            
    
    answer = []
    sortCarDict = sorted(carDict)
    
    
    for i in sortCarDict:
        tmpCar = carDict[i]
        if (tmpCar[0] <= fees[0]):
            answer.append(fees[1])
        else:
            answer.append(fees[1]+(math.ceil((tmpCar[0]-fees[0]) / fees[2]))*fees[3])
            
    return answer
LIST