https://school.programmers.co.kr/learn/courses/30/lessons/92341
"""
입출력 예시)
fees = [180, 5000, 10, 600], records = ["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]
fees = [120, 0, 60, 591], records = ["16:00 3961 IN","16:00 0202 IN","18:00 3961 OUT","18:00 0202 OUT","23:58 3961 IN"] -> [0, 591]
fees = [1, 461, 1, 10], records = ["00:00 1234 IN"] -> [14841]
"""
import math
# 시각을 분으로 변환하는 함수
def time_to_min(time):
h, m = map(int, time.split(':'))
return h*60 + m
def solution(fees, records):
answer = []
# 기본 시간, 기본 요금, 단위 시간, 단위 요금
dt, df, ut, uf = fees
dic = {} # 차량번호별 입/출차 내역을 담을 dict
for r in records:
#시각, 차량번호, 내역
time, car_num, in_out = r.split()
car_num = int(car_num)
if car_num not in dic: # 차량번호가 dic에 없는 경우
dic[car_num] = [[time_to_min(time), in_out]] # key:차량번호, value:[[시각(분), 내역]]
else: # 차량번호가 dic에 있는 경우
dic[car_num].append([time_to_min(time), in_out])
# 차량번호가 작은 자동차부터 청구할 주차 요금을 차례대로 정수 배열에 담기 위해 dic을 리스트로 변환
dic_list = list(dic.items()) # 차량번호별로 시각과 내역을 담은 리스트
# -> [(차량번호, [[시각(분), 내역], [시각(분), 내역], [시각(분), 내역], [시각(분), 내역]]), ()]
dic_list.sort(key=lambda x : x[0]) # 차량번호 기준으로 오름차순 정렬
for d in dic_list:
total_t = 0 # 누적 주차 시간
for time_his in d[1]: # time_his -> [시각(분), 내역]
# 시각(분), 내역
t, his = time_his
if his == 'IN': # 내역이 'IN'인 경우
total_t -= t # 누적 주차 시간 = 누적 주차 시간 - 시각(분)
else: # 내역이 'OUT'인 경우
total_t += t # 누적 주차 시간 = 누적 주차 시간 + 시각(분)
if d[1][-1][1] == 'IN': # 마지막 내역이 'IN'인 경우(출차된 내역이 없을 때)
total_t += time_to_min('23:59') # 누적 주차 시간 = 누적 주차 시간 + 23:59를 분으로 변환한 값
if total_t <= dt: # 누적 주차 시간이 기본 시간과 작거나 같은 경우
answer.append(df) # 주차 요금 = 기본 요금
else: # 누적 주차 시간이 기본 시간보다 큰 경우
# 주차 요금 = 기본 요금 + ((누적 주차 시간 - 기본 시간)/단위 시간) * 단위 요금
total_fee = df + math.ceil((total_t-dt)/ut) * uf
answer.append(total_fee)
return answer
- list.sort()와 sorted(list) 차이
- list.sort(key=None, reverse=False)
- 원본 리스트의 순서를 자체를 변경 (원본 리스트에 영향 O)
- 반환 값이 None
- 새로운 복사본을 만들지 않아 sorted(list)보다 빠름
- sorted(iterable, key=None, reverse=False)
- 정렬된 새로운 리스트를 반환 (원본 리스트에 영향 X)
- 모든 iterable에 사용 가능 (list, tuple, dict, str, ...)
- dic.items()
- 딕셔너리에 저장된 모든 Key값과 Value값 출력
- -> [(key, value), (key, value), ...]
- math.ceil()
- 실수를 입력하면 올림해서 정수를 반환
- 괄호 안의 수는 float 타입의 실수를 입력
- 정수를 입력하면 아무런 변화 없이 정수를 그대로 반환함
참고)
https://velog.io/@minnseong/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%EC%A3%BC%EC%B0%A8-%EC%9A%94%EA%B8%88-%EA%B3%84%EC%82%B0
https://inma.tistory.com/137
https://hsd0937.tistory.com/20
https://ooyoung.tistory.com/99