알고리즘
[프로그래머스] LV2. 주차요금 계산
j9972
2023. 3. 20. 14:26
728x90
문제
https://school.programmers.co.kr/learn/courses/30/lessons/92341
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
접근
1. 들어가고 나오는 순서가 중요하지 않으니 stack,queue 말고 dict으로 풀면 된다 생각함
2. status를 두어서 후에 같은 차량이 들어와도 상관없게 함
3. status을 기준으로 누적 시간을 구함
4. ceil 대신에 시간이 더 있으면 한번더 추가요금을 내는걸로 계산함
풀이
from collections import defaultdict
def solution(fees, records):
ans = []
res = []
dic = defaultdict(list)
for i in records:
data = i.split(' ')
times = data[0].split(':')
time = int(times[0]) * 60 + int(times[1])
if data[1] not in dic:
dic[data[1]] = [time, data[2], True]
else:
if dic[data[1]][2] == True:
dic[data[1]][2] = False
res.append([time - dic[data[1]][0], data[1]])
else:
dic[data[1]] = [time, data[2], True]
for d in dic.items():
#print(d[1][2])
#print(d)
if d[1][2] == True:
res.append([1439-d[1][0] , d[0]])
#print(res)
time = {}
for i in res:
if i[1] not in time:
time[i[1]] = i[0]
else:
time[i[1]] += i[0]
#print(time)
basicTime,basicMoney,addTime,addMoney= fees
sorted_time = dict(sorted(time.items(), key=lambda x: x[0]))
#print(sorted_time)
for t in sorted_time.items():
if t[1] <= basicTime:
money = basicMoney
else:
tt = t[1] - basicTime
if tt % addTime == 0:
money = basicMoney + (tt // addTime) * addMoney
else:
money = basicMoney + (tt // addTime) * addMoney + addMoney
ans.append(money)
money = 0
return ans
시간은 좀 걸리고, 코드가 복잡하지만 스스로 풀어서 대견함