문제 링크
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
풀이
- 이렇게 푸는 게 맞나 싶었다.........
- 딕셔너리를 이용해서 풀었다. defaultdict 에 조금 익숙해지고 나니깐 되게 자주 사용하게 되는 듯하다
- result 는 자동차 번호 별 총 주차 시간을 기록
- t_record는 자동차 번호 별 입차 시간을 기록
1. 'IN'이라면 시간을 분으로 표시하여 t_record에 저장한다. 이 때 key는 주차번호를 정수형으로 바꿔주어야 나중에 자동차 번호가 작은 거부터 정렬이 가능하다. 아니면 문자열 정렬을 하게 된다.
2. 'OUT'이라면 t_record에서 입차 시간을 빼고(pop) 주차 시간(출차시간 -입차시간)을 계산하여 result에 더한다.
3. 만약 t_record에 입차 기록이 남아있다면 출차한 기록이 없다는 것이므로 23:59에 출차한 것으로 계산하여 result 에 더한다.
4. 자동차 번호인 t_record의 key를 기준으로 오름차순 정렬한다.
5. 총 주차시간이 기본 시간보다 작거나 같으면 기본 요금을 answer에 추가 한다.
총 주차시간이 기본 시간보다 크면 조건에 맞게 계산하여 answer에 추가한다.
from collections import defaultdict
import math
def solution(fees, records):
answer = []
# 총 주가 시간 기록
result = defaultdict(int)
# 입차 시간 기록
t_record = dict()
for i in records:
s = i.split()
# 입차 시간 기록
if s[2] == 'IN':
h, m = map(int, s[0].split(":"))
# 계산하기 편하도록 모두 분으로 변경
t_record[int(s[1])] = h*60 + m
else :
h, m = map(int, s[0].split(":"))
# 출차시간에서 입차시간을 빼고 그 값을 result[차번호]에 더한다
result[int(s[1])] += (h*60 + m)- t_record.pop(int(s[1]))
# 입차 시간이 남아있다면 23:59에 나간 것으로 계산
for i in t_record.keys():
result[i] += (23*60 + 59) - t_record[i]
# 차번호 기준으로 정렬
result = sorted(result.items(), key = lambda x : x[0])
for i in result:
# 기본 시간보다 주차시간이 작거나 같으면 기본 요금
if i[1] <= fees[0]:
answer.append(fees[1])
# 기본 시간보다 주차 시간이 길면 조건에 맞게 요금 계산
else:
answer.append(fees[1] + (math.ceil((i[1]-fees[0])/fees[2])) * fees[3])
return answer
'개발 > algorithm' 카테고리의 다른 글
[프로그래머스] [level2] 카펫 - python (0) | 2022.02.04 |
---|---|
[프로그래머스] [level2] 큰 수 만들기 -python (0) | 2022.02.04 |
[프로그래머스][level2] 가장 큰 수 -python (0) | 2022.02.04 |
[백준 3986번] 좋은 단어 -python (0) | 2022.02.04 |
[백준 4949번] 균형잡힌 세상 -python (0) | 2022.02.04 |