Just Fighting
[프로그래머스] 주차 요금 계산 본문
https://programmers.co.kr/learn/courses/30/lessons/92341
<문제 설명>
[기본시간, 기본요금, 단위시간, 단위요금] 의 요금표가 있고,
차량의 입출차 기록이 (시간, 차량번호, 내역)으로 주어진다.
이 차량들의 요금을 계산하는 문제이다.
00:00 부터 23:59 까지의 주차 누적시간을 통해 요금을 계산한다.
기본 시간동안 주차했을 경우 기본요금만 청구되지만,
기본 시간이 넘어갈 경우 단위시간에 따라 요금이 추가로 청구된다.
이때 기본 시간이 초과된 시간이 단위 시간으로 딱 나누어 떨어지지 않으면 나눈 값을 올림한다.
최종적으로 구해진 요금을 차량번호가 작은 순서대로 return하는 것이 목적이다.
<문제 이해>
일단 주차된 시간을 계산하기 위해서 입차했을 때 시간을 저장하는 것이 필요할 것이라고 생각했다.
그리고 시간을 계산할 때는 분단위로 저장해 계산하는 것이 좋다고 판단했다.
문제를 크게 두 개로 나누어 풀면 좋겠다고 생각했다. ①시간 계산 ② 요금 계산
< 문제 풀이>
처음에 차가 한 번만 들어오는 줄 알고 같은 딕셔너리에서 시간 계산을 하려고 했으나,
여러 번 들어올 수 있다는 것을 알고 입차 시간을 기록하는 딕셔너리와 누적시간을 담는 딕셔너리를 따로 만들었다.
그리고 누적시간을 출력해보았더니 예시랑은 다른 결과가 나왔었다.
차가 들어가기만 하고 나오지 않는 경우를 고려해주지 않았기 때문이다.
나오지 않는 경우는 마지막 시간이 23:59 이기 때문에 따로 계산을 해주었다.
또한 요금을 올림해주는것도 잊지 않았다.
막혔던 부분은 딕셔너리 정렬 부분이었다. 이건 마지막에 따로 정리를 할 것이다.
def solution(fees, records):
time = {}
start = {}
end = 23*60 + 59 # 마지막 시간
fee = {}
# 기록을 기반으로 누적시간 계산
for re in records:
words = re.split()
t = int(words[0][0:2]) * 60 + int(words[0][3:]) # 시각을 분으로 변환
if words[2] == "IN": # IN 이면 start에 추가
start[words[1]] = t
else: # OUT 이면 start를 빼줌
tdel = t - start[words[1]]
time[words[1]] = tdel if words[1] not in time else time[words[1]] + tdel
start[words[1]] = -1 # start를 -1로 설정
# 차가 주차장에서 나가지 않았을 경우 계산
for s in start:
if start[s] != -1: # -1이면 차가 나갔다는 것을 의미
tdel = end - start[s]
time[s] = tdel if s not in time else time[s] + tdel
# 요금 계산
for t in time:
fee[t] = fees[1]
if time[t] > fees[0]:
if (time[t]-fees[0]) % fees[2] == 0: # 딱 나누어 떨어지지 않으면 반올림
fee[t] += (int((time[t]-fees[0])/fees[2]))*fees[3]
else:
fee[t] += (int((time[t]-fees[0])/fees[2]+1))*fees[3]
# 차량번호 순으로 정렬
fee = sorted(fee.items())
answer = [x[1] for x in fee]
return answer
오늘 문제는 코드가 상당히 길다. 풀면서도 계속 코드 길이를 줄일 수 있는 방법을 생각했지만 실패했다.
문제를 풀고 다른 사람들의 풀이를 참고하고자 봤더니 다른 사람 코드는 더 길어서 코드 개선은 생략하도록 하겠다.
<추가 개념 - 딕셔너리 정렬>
① key 기준 정렬
dic = {'A':1, 'B':3, 'C':2}
dic1 = sorted(dic.items()) # 리스트
dic2 = dict(sorted(dic.items())) # 딕셔너리
단, sorted는 list를 반환하기 때문에 딕셔너리를 만들고 싶다면 dict()를 사용해야함.
② value 기준 정렬
dic3 = sorted(dic.items(), key = lambda x : x[1]) # 람다함수 이용
③ 내림차순 정렬
dic4 = sorted(dic.items(), reverse=True)
'Algorithm > 코딩테스트 연습' 카테고리의 다른 글
[프로그래머스] 메뉴 리뉴얼 (0) | 2022.01.21 |
---|---|
[프로그래머스] 양궁대회 (0) | 2022.01.20 |
[프로그래머스] k진수에서 소수 개수 구하기 (0) | 2022.01.18 |
[프로그래머스] 신고 결과 받기 (0) | 2022.01.17 |
[프로그래머스] 크레인 인형뽑기 게임 (0) | 2022.01.13 |