알고리즘/프로그래머스

[2022 KAKAO BLIND RECRUITMENT] 주차 요금 계산

래울 2022. 8. 24. 19:44

https://school.programmers.co.kr/learn/courses/30/lessons/92341?language=python3 

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

문제 설명

 

  - 들어오고 나가는 차량에 대해서, 요금을 계산하려고 한다.

 

 

 

주어지는 데이터

 

  - fees에는 기본시간(분), 기본요금, 단위시간(분), 단위요금 이 담겨있다.

  - records는 시간, 차량번호, 기록(IN, OUT) 이 담겨있다.

 

 

 

풀이

 

1. 각 차량의 번호를 key로 가지고, 입차했던 시간을 value로 가지는 딕셔너리를 만든다.

모든 입-출차 시간을 각각 계산하여 더할까 하다가, 좀 더 괜찮은 방법을 생각해냈다.

만약 A라는 차량에 대한 입출차 시간이 아래와 같다면

시간 입차/출차 value(분단위로 계산)
05:00 입차 -300
07:00 출차 120
17:00 입차 -900
19:00 출차 240

tb[b] += (int(a[0:2])*60 + int(a[3:5])) * (-1 if c=='IN' else 1)  과 같이

입차시간의 경우 value에서 빼주고, 출차시간의 경우 더해주면, 결국 필요한 값이 남게된다.

 

2. 조건에 따라 값 반환

조건에 따라 차량의 번호가 작은 순서대로 반복하여 answer에 추가해준다.

 

3. 코드

from collections import defaultdict
import math
def solution(fees, records):
    tb = defaultdict(int)
    answer = []
    for r in records:
        a, b, c = r.split(' ')
        tb[b] += (int(a[0:2])*60 + int(a[3:5])) * (-1 if c=='IN' else 1)
    for k in sorted(tb.keys()):
        time = tb[k] if tb[k] > 0 else tb[k]+1439
        if time <= fees[0]:
            answer.append(fees[1])
        else:
            answer.append(math.ceil((time - fees[0])/fees[2]) * fees[3] + fees[1])
    return answer