2022 KAKAO BLIND RECRUITMENT 에서 출제된 문제로, 규칙을 지정하여 푸는 방식이다.
문제 링크: https://school.programmers.co.kr/learn/courses/30/lessons/92341
입출력 예
fees = [180, 5000, 10, 600]
records = ["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"]
results = [14600, 34400, 5000]
fees는 [기본 시간, 기본 요금, 단위 시간, 단위 요금]으로 구성되어 있고, records는 [시각, 차량 번호, 내역]으로 구성되어 있다. 마지막 results는 차량 번호의 순서대로 주차 요금을 나타내고 있다.
입력 받은 시간은 문자열 형태로 되어 있기 때문에, 이를 변환하는 코드를 작성한다.
def str2min(time):
hour_, min_ = time.split(':')
return int(hour_) * 60 + int(min_)
그런 다음, 분석에 필요한 defaultdict와 ceil 함수를 호출하고, 아래와 같이 코드를 작성할 수 있다.
from collections import defaultdict
from math import ceil
def solution(fees, records):
default_time, default_fee, unit_time, unit_fee = fees
assets = defaultdict(int)
accumulate = defaultdict(int)
fees = defaultdict(int)
answers = []
for record in records:
times, car_number, types = record.split()
times = str2min(times)
if types == 'IN':
assets[car_number] = times
elif types == 'OUT':
accumulate[car_number] += times - assets[car_number]
del assets[car_number]
for car_number, elapsed_time in assets.items():
elapsed_time = str2min('23:59') - elapsed_time
accumulate[car_number] += elapsed_time
for car_number, elapsed_time in sorted(accumulate.items(), key = lambda x: x[0]):
fee = default_fee + max(0, ceil((elapsed_time - default_time)/unit_time) * unit_fee)
answers.append(fee)
return answers
record는 records에 값을 불러와 times, car_number, types 형태로 변환한다. types는 입출차를 나타내기 때문에 먼저 입차인지 출차인지를 확인하여야 한다. 입차인 경우 차량 번호에 시작 시간(time)을 저장한다. 출차인 경우에는 입차에 입력된 시간에서 현재까지 몇 분 지났는지를 측정하면 된다. 그런 다음, 입,출차 기록을 지운다.
그 다음 for문에서는 assets에 남아있는, 즉, 입차 기록은 있으나 출차 기록이 없는 차량에 대해서 23:59분을 기준으로 누적 주차 시간을 계산한다. 마지막으로, 누적 시간을 바탕으로 주차 요금을 계산하면 된다. ceil은 올림하는 숫자를 나타내며, 만약 기본 시간보다 적게 이용한 차량의 경우 ceil 안의 값이 음수로 나오기 때문에 0을 기준으로 최댓값을 출력하면 된다.
'Python > Algorithm' 카테고리의 다른 글
[프로그래머스] 숫자 변환하기 - Python (0) | 2023.08.27 |
---|---|
[프로그래머스] 뒤에 있는 큰 수 찾기 - Python (0) | 2023.08.27 |
[프로그래머스] 신고 결과 받기 - Python (4) | 2023.08.24 |
[프로그래머스] 크레인 인형뽑기 게임 - Python (0) | 2023.08.24 |
[프로그래머스] 키패드 누르기 - Python (0) | 2023.08.24 |