https://programmers.co.kr/learn/courses/30/lessons/92341?language=python3
풀이 과정
본문이 너무 길어서 내가 이해한게 맞나 자주 확인해보아야 했던 문제 같다.
- 시간을 처리할 때는 그냥 분으로 모두 바꿔준 다음에 처리해주는게 체감상 제일 좋다. 따라서 시-분으로 구성되어 있는 형태를 분으로 바꾸어주는 함수를 만들어 준다.
- 이후, 입력된 기록에 맞추어서 다음 과정을 반복한다.
- 전체 주차 시간을 저장해 둘 딕셔너리를 따로 만들어 둔다.
- IN 표시가 되어있는 경우는, 해당 차의 주차 시간을 딕셔너리에 저장한다.
- OUT 표시가 되어 있는 경우는, 출차 시간에서 딕셔너리에 저장된 주차 시간을 빼준 값을 전체 주차 시간을 저장해 둘 딕셔너리에 더해 준다. 또한 이 때, OUT이 되었음을 나타내기 위해 값을 -1로 처리해 준다.
- 위 과정을 끝내고 나서, OUT 처리가 되지 않은 경우는 23:59에 출차한 것으로 간주하여 처리해 준다.
- (값이 -1이 아닌 경우)
- 마지막으로, 주차 요금을 구해 준다.
- 차량 번호순으로 구해주어야 하므로 처음부터 딕셔너리의 키값을 정렬해서 진행하는게 편하다.
- 기본 시간보다 작거나 같은 경우는 기본 요금으로 처리해 준다.
- 기본 시간보다 크다면 다음 수식을 적용해준다.
- 기본 요금 + math.ceil((주차 시간 - 기본 시간) / 단위 시간) * 단위 요금
- 올림 기호를 사용하는 법을 모르므로 math.ceil로 표시함..ㅎㅎ
소스 코드
from collections import defaultdict
import math
def htom(s):
return 60 * int(s[:2]) + int(s[3:])
def solution(fees, records):
answer = []
park_time = defaultdict(lambda: 0)
in_time = defaultdict(lambda: 0)
for record in records:
time, number, status = record.split()
if status == 'IN':
in_time[number] = htom(time)
if status == 'OUT':
park_time[number] += htom(time) - in_time[number]
in_time[number] = -1
last_time = htom("23:59")
default_time, default_fee, per_minute, per_fee = fees
for key in sorted(in_time.keys()):
if in_time[key] != -1:
park_time[key] += last_time - in_time[key]
if park_time[key] <= default_time:
answer.append(default_fee)
else:
answer.append(default_fee + (
math.ceil((park_time[key] - default_time) / per_minute)
) * per_fee)
return answer
'알고리즘[Python] > 프로그래머스' 카테고리의 다른 글
[ Lv 2 ] k진수에서 소수 개수 구하기 (0) | 2022.01.16 |
---|---|
[ Lv 3 ] [ 이분 탐색 ] 금과 은 운반하기 (0) | 2021.12.26 |
[ Lv 3 ] [ DP ] 스티커 모으기 (0) | 2021.12.22 |
[ Lv 2 ] n^2 배열 자르기 (0) | 2021.11.27 |
[ 위클리 챌린지 ] [ 12주차 ] 피로도 (0) | 2021.10.25 |