출처: 프로그래머스 코딩 테스트 연습, [프로그래머스] 주차 요금 계산
1. '??:??'
이런 형식의 시간문자열 분으로 바꾸는 메서드 구현
2. 해시테이블을 이용해서 차량이 주차한 시간 측정, { key : [시작시간, 총 시간], ... }
IN, OUT
을 통해 차량이 주차장에 들어오는지 판단하고 들어오고 있다면 해시에서 차량번호를 찾아가 시작시간을 초기화해준다. 차량이 주차장을 나간다면 해시에서 나간시간에서 저장해둔 시작시간을 뺀 값을 기존의 총 시간에 추가한다. 시작시간에는 -1
으로 초기화하여 차량이 주차장에 없음을 표시한다.
3. 차량번호가 작은 순서대로 출력해야하므로 해시의 키를 오름차순으로 정렬한다.
4. 만약 입/출차기록을 모두 마쳤음에도 시작시간에 -1
이 아닌 값이 있다면 '23:59'
에 출차한 경우이므로 이 경우에 기존의 총 시간에 추가해준다.
5. 기본 시간보다 클 때, 작을 때를 나누어 주차요금을 계산해주면 된다.
def cal_min(str_num):
str_hour, str_min = str_num.split(':')
return int(str_hour) * 60 + int(str_min)
def solution(fees, records):
"""
차량번호가 작은 자동차부터 출력
in -> flag = 0 : False
out -> flag = 1 : True
"""
d_min, d_price, u_min, u_price = fees
answer = []
dic = {}
for record in records:
rec = record.split(' ')
r_min, r_num, r_flag = cal_min(rec[0]), int(rec[1]), len(rec[2]) - 2
if not r_flag:
if r_num not in dic:
dic[r_num] = [r_min, 0] # 시작시간, 총 시간
else:
dic[r_num][0] = r_min
else:
time = r_min - dic[r_num][0]
dic[r_num][0] = -1
dic[r_num][1] += time
for num in sorted(dic):
if dic[num][0] != -1:
time = cal_min('23:59') - dic[num][0]
dic[num][1] += time
if dic[num][1] > d_min:
answer.append(d_price + ((dic[num][1] - d_min + u_min - 1) // u_min) * u_price)
else:
answer.append(d_price)
return answer