728x90
주차 요금 계산에 대한 문제 설명은 다음의 링크를 참고해주시기 바랍니다. 문제 설명
시간 순서로 저장되어 있는 차량 입출차 기록을 기준으로 차량 번호를 기준으로 정렬된 주차 요금 내역을 결과로 반환하는 문제입니다. 유의해야 할 사항은 다음과 같습니다.
- 임의의 차량이 입차된 기록만 있고, 출차된 기록이 없다면 23:59에 출차된 것으로 간주한다.
- 기본 시간을 초과한 차량에 대해서 단위 시간 요금을 청구할 때 (주차 시간 / 단위 시간)의 값이 소수일 경우 올림 한다.
다음은 문제 해결 순서입니다.
- record를 공백을 기준으로 분리한다.
- car_id를 key로 check_time을 value로 car_dict에 저장한다.
- car_dict를 순환하며 이때의 value 배열의 길이가 2보다 작은지 확인한다.
- 3의 결과가 참이라면 in_time = value.pop(0), out_time = "23:59"로 설정한다.
- 3의 결과가 거짓이라면 in_time, out_time을 모두 value.pop(0)으로 설정한다.
- in_time과 out_time을 기준으로 주차 요금을 계산하여 answer_dict에 주차 요금을 저장한다.
- answer_dict을 정렬하여 순환하며 주차 요금만 결과로 반환해준다.
다음은 해결 순서를 기준으로 작성한 코드입니다.
import math
import datetime
def sub_time(in_time: str, out_time: str) -> int:
time_format = "%H:%M"
in_time = datetime.datetime.strptime(in_time, time_format)
out_time = datetime.datetime.strptime(out_time, time_format)
return (out_time - in_time).seconds // 60
def calc_fees(value: int, fees: list) -> int:
if value <= fees[0]:
return fees[1]
else:
return int(fees[1] + math.ceil((value - fees[0]) / fees[2]) * fees[3])
def get_calc_fees_by(values: list, fees: list) -> int:
minute = 0
while values:
out_time = "23:59"
in_time = values.pop(0)
if values:
out_time = values.pop(0)
minute += sub_time(in_time, out_time)
return calc_fees(minute, fees)
def solution(fees: list, records: list) -> list:
answer_dict = {}
car_dict = {}
records = [record.split() for record in records]
for check_time, car_id, _ in records:
if car_id in car_dict:
car_dict[car_id].append(check_time)
else:
answer_dict[car_id] = 0
car_dict[car_id] = []
for key, values in car_dict.items():
answer_dict[key] = get_calc_fees_by(values, fees)
return [item[-1] for item in sorted(answer_dict.items())]
다음은 코드에 구현된 함수들에 대한 설명입니다.
- sub_time: in_time과 out_time이 주어지면 두 값의 차를 분으로 반환한다.
- calc_fees: value와 fees를 사용하여 차량의 주차 요금을 계산하여 반환한다.
- get_calc_fees_by: 임의의 차량의 모든 주차 시간 values를 순환하며 주차 시간을 모두 계산한 후에 calc_fees를 호출하여 주차 요금을 반환한다.
문제를 해결한 후 다시 한번 문제를 확인해보니 sub_time처럼 시간을 기준으로 계산하지 않고 분을 기준으로 계산하면 조금 더 깔끔한 코드를 얻을 수 있을 것 같습니다. 또한 차량 번호가 0000~9999까지로 제한이 되니 딕셔너리가 아닌 배열을 사용하면 record 값을 순환하며 바로바로 주차 시간을 계산할 수 있을 것 같습니다.
728x90
'취업을 준비하며 정리하는 컴퓨터 지식 > Problem Solving' 카테고리의 다른 글
[Problem Solving] 프로그래머스 17679 프렌즈 4블록 (0) | 2022.01.20 |
---|---|
[Problem Solving] 프로그래머스 92335 k 진수에서 소수 개수 구하기 (2) | 2022.01.19 |
[Problem Solving] 프로그래머스 92334 신고 결과 받기 (0) | 2022.01.14 |
[Problem Solving] 프로그래머스 42576 완주하지 못한 선수 (0) | 2022.01.13 |
[Problem Solving] 프로그래머스 67257 수식 최대화 (0) | 2022.01.12 |