알고리즘/프로그래머스
[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