728x90
반응형
1. 문제 설명
2. 풀이과정
- 요금 청구를 할 때 올림 함수 ceil()을 사용하기 위해 math 모듈을 불러온다. import math
- 자동차의 입차와 출차 내역을 저장할 딕셔너리를 생성한다. d = {}
- 각 자동차 별로 누적 주차 시간을 저장할 딕셔너리를 생성한다. minute = {}
- 입차와 출차 정보를 담은 정보를 하나씩 추출한다. for i in records
- 공백으로 각 정보가 구분되어 있기 때문에 분리하여 따로 저장해 준다. time, num, op = i.split()
- 시간은 다시 시와 분으로 나눠 저장해 준다. hour, min = time.split(":")
- 만약 해당 차량이 입차하는 것이라면 if (op == 'IN')
- 차 번호를 key로 하고 입차 시간을 분으로 환산한 결과를 value로 저장한다. d[num] = int(hour) * 60 + int(min)
- 분으로 환산한 결과를 저장하는 이유는 나중에 누적 주차 시간을 단순 뺄셈으로 변하게 구하기 위해서다.
- 반면에 해당 차량이 출차하는 것이라면 else
- 주차 시간을 구한다. total = (int(hour) * 60 + int(min)) - d[num]
- 주차 시간은 입차 시간에서 출차 시간을 빼주면 되는데 출차 시간도 분으로 환산하여 그 결과를 활용한다.
- 만약 해당 번호의 차량이 처음 출차하는 것이 아니라면 if (num in minute)
- 해당 차량의 누적 주차 시간에 시간을 추가해 준다. minute[num] += total
- 반면에 해당 번호의 차량이 처음 출차하는 것이라면 else
- 해당 차량의 번호를 key로 하고 주차 시간을 value로 저장한다. minute[num] = total
- 출차한 차량의 key(번호)를 제거한다. del d[num]
- 모든 입차, 출차 내역을 확인한 뒤, 만약 아직 출차하지 않은 차량이 있다면 하나씩 추출하여 for i in d
- 23시 59분에 출차한 것으로 판단하고 주차 시간을 계산한다. total = (23 * 60 + 59) - d[i]
- 만약 해당 번호의 차량이 처음 출차하는 것이 아니라면 if (i in minute)
- 해당 차량의 누적 주차 시간에 시간을 추가해 준다. minute[i] += total
- 반면에 해당 번호의 차량이 처음 출차하는 것이라면 else
- 해당 차량의 번호를 key로 하고 주차 시간을 value로 저장한다. minute[i] = total
- 차량 번호가 작은 자동차부터 주차 요금을 저장해야 하므로 차량 번호인 key를 기준으로 오름차순 정렬해 준다. minute = sorted(minute.items())
- 정렬한 결과를 하나씩 추출하여 for i in minute
- 만약 누적 주차 시간이 기본 시간을 초과했다면 if (i[1] > fees[0])
- 기본 요금에 초과한 시간의 단위 시간마다 단위 요금을 더해 청구한다. 초과한 시간이 단위 시간으로 나누어 떨어지지 않으면 올림 하여 계산한다. cost = math.ceil((i[1] - fees[0]) / fees[2]) * fees[3] + fees[1]
- 반면에 누적 주차 시간이 기본 시간 이하라면 else
- 주차 요금은 기본 요금이 된다. cost = fees[1]
- 계산한 주차 요금을 정답 리스트에 추가해 준다. answer.append(cost)
반응형
3. 소스코드
import math
def solution(fees, records):
answer = []
d = {}
minute = {}
for i in records:
time, num, op = i.split()
hour, min = time.split(":")
if (op == 'IN'):
d[num] = int(hour) * 60 + int(min)
else:
total = (int(hour) * 60 + int(min)) - d[num]
if (num in minute):
minute[num] += total
else:
minute[num] = total
del d[num]
for i in d:
total = (23 * 60 + 59) - d[i]
if (i in minute):
minute[i] += total
else:
minute[i] = total
minute = sorted(minute.items())
for i in minute:
if (i[1] > fees[0]):
cost = math.ceil((i[1] - fees[0]) / fees[2]) * fees[3] + fees[1]
else:
cost = fees[1]
answer.append(cost)
return answer
728x90
반응형
'프로그래머스 > Python' 카테고리의 다른 글
[프로그래머스] 주식가격 - 파이썬(Python) - 우당탕탕 개발자 되기 프로젝트 (0) | 2023.08.18 |
---|---|
[프로그래머스] 땅따먹기 - 파이썬(Python) - 우당탕탕 개발자 되기 프로젝트 (0) | 2023.08.17 |
[프로그래머스] 로또의 최고 순위와 최저 순위 - 파이썬(Python) - 우당탕탕 개발자 되기 프로젝트 (0) | 2023.08.16 |
[프로그래머스] 단어 변환 - 파이썬(Python) - 우당탕탕 개발자 되기 프로젝트 (0) | 2023.08.15 |
[프로그래머스] 오픈채팅방 - 파이썬(Python) - 우당탕탕 개발자 되기 프로젝트 (0) | 2023.08.13 |
[프로그래머스] 더 맵게 - 파이썬(Python) - 우당탕탕 개발자 되기 프로젝트 (0) | 2023.08.12 |
[프로그래머스] [3차] n진수 게임 - 파이썬(Python) - 우당탕탕 개발자 되기 프로젝트 (0) | 2023.08.11 |
[프로그래머스] [1차] 다트 게임 - 파이썬(Python) - 우당탕탕 개발자 되기 프로젝트 (0) | 2023.08.10 |