[프로그래머스] 주차 요금 계산
난이도 : 2단계
사용 언어 : 파이썬
2022 KAKAO BLIND RECRUITMENT
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
import math
def setting(records) :
parking = {}
for rec in records :
a,b,c = rec.split()
try :
parking[b].append(a)
except :
parking[b] = []
parking[b].append(a)
return parking
def timecal(str1,str2) :
s1 = list(map(int,str1.split(':')))
s2 = list(map(int,str2.split(':')))
si = (s2[0]-s1[0])
bun = (s2[1]-s1[1])
return (si*60)+bun
def lasttimecal(str1) :
s1 = list(map(int,str1.split(':')))
s2 = [23,59]
si = (s2[0]-s1[0])
bun = (s2[1]-s1[1])
return (si*60)+bun
def cal(dic):
carnum = list(dic.keys())
result = {}
for car in carnum:
time = 0
for i in range(0, len(dic[car]), 2):
try:
time += timecal(dic[car][i], dic[car][i + 1])
except:
time += lasttimecal(dic[car][i])
result[car] = time
return result
def yogum(timedic,fees) :
answer = []
lst = sorted(timedic.items(), key = lambda x : x[0],reverse=False)
for i,j in lst :
tip = 0
if j <= fees[0]: tip = fees[1] #기본 시간 이하라면, 기본 요금 청구
elif j > fees[0] :
j = (j-fees[0])
tip += fees[1]
tip += (math.ceil((j/fees[2])) * fees[3])
answer.append(tip)
return answer
def solution(fees,records) :
result = cal(setting(records))
answer = yogum(result,fees)
return answer
풀이순서
1. 차량 번호 별 주차 정보 dictionary 만들기
records 로 받은 입출차 정보를 차량 번호(carnum)를 key로 하고, value는 입출차 시간 리스트로 dictionary 만든다
EX) 5961(차번호) : ['18:00','18:35','23:00']
2. 주차 시간 계산
list의 요소를 ':' 으로 split 하고 int로 변환 ->split 결과 리스트의 [0]번 요소 = 시간 , [1]번 요소 = 분 으로 나누어 계산
입 , 출차 짝이 있을 경우 : (뒷시간 - 앞시간) ->timecal함수로 구현
입차 시간만 있을 경우 : (앞시간 - '23:59') -> lasttimecal함수로 구현
-> 차 번호 별 주차 시간 dictionary 를 만들 수 있다.
EX) 5961(차번호) : 146
3. 요금정보(fees)를 이용하여, 주차 시간에 대한 요금(tip)을 계산한다.
* 중요 ! 차량번호가 작은 순으로 값을 계산하여 list로 담아내야한다.
->dictionary. items()를 활용하여 차량 번호 순으로 정렬 하여 계산
#경우의 수 1
기본 시간보다 작거나 같은 경우 : 기본 요금 (고정)
#경우의 수 2
기본 시간보다 초과한 경우 : 기본 요금 + |(주차 시간 - 기본요금)/추가시간|* 추가요금
(주차시간 - 기본요금)이 추가 시간으로 나누어 떨어지지 않을 경우, 올림 : math 모듈의 ceil (올림) 함수 사용