728x90
주차 요금 계산에 대한 문제 설명은 다음의 링크를 참고해주시기 바랍니다. 문제 설명
코딩테스트 연습 - 주차 요금 계산
[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
시간 순서로 저장되어 있는 차량 입출차 기록을 기준으로 차량 번호를 기준으로 정렬된 주차 요금 내역을 결과로 반환하는 문제입니다. 유의해야 할 사항은 다음과 같습니다.
- 임의의 차량이 입차된 기록만 있고, 출차된 기록이 없다면 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 |