https://school.programmers.co.kr/learn/courses/30/lessons/92341
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
from math import ceil
def solution(fees, records):
car_info = {}
results = []
for record in records:
time, car_number, in_out = record.split()
time = change_minute(time)
if car_number not in car_info:
car_info[car_number] = {}
car_info[car_number]['cost_time'] = 0
car_info[car_number]['stack'] = []
if in_out == 'IN':
car_info[car_number]['stack'].append(time)
elif in_out == 'OUT':
in_time = car_info[car_number]['stack'].pop()
out_time = time
car_info[car_number]['cost_time'] += (out_time - in_time)
for car_number in car_info:
if car_info[car_number]['stack'] != []:
in_time = car_info[car_number]['stack'].pop()
out_time = change_minute("23:59")
car_info[car_number]['cost_time'] += (out_time - in_time)
minute = car_info[car_number]['cost_time']
results.append((car_number, cost(minute, fees)))
result = [cost for _, cost in sorted(results, key=lambda x : int(x[0]))]
return result
def cost(minute, fees):
base_minute = fees[0]
base_cost = fees[1]
unit_minute = fees[2]
unit_cost = fees[3]
result = 0
if minute > base_minute:
result += base_cost
c = ceil((minute - base_minute)/unit_minute)
result += (c * unit_cost)
else:
result = base_cost
return result
def change_minute(time):
time_split = time.split(':')
hour = int(time_split[0])
minute = int(time_split[1])
result = (hour * 60) + minute
return result
문제 풀이에 앞서 문제 해결에 사용한 함수 cost()
와 change_minute()
를 설명하겠습니다.
cost()
cost
함수는 입력으로 들어오는 fees
와 누적 주차 시간을 나타내는 minute
파라미터를 이용하여 요금을 계산하는 함수입니다.
fees
파라미터는 다음과 같이 변수에 저장하였습니다.
base_minute
: 기본 시간(분)base_cost
: 기본 요금(원)unit_minute
: 단위 시간(분)unit_cost
: 단위 요금(원)
누적 주차 시간(minute
)이 기본 시간(base_minute
)보다 크다면 기본 시간을 초과하였다는 의미입니다.
따라서 누적 주차 시간에서 기본 시간을 빼준 뒤 단위 시간을 나누고
나누어 떨어지지 않는다면 math.ceil()
를 사용하여 올림합니다.
계산된 값 c
와 단위 요금(unit_cost
)을 곱하고 result
에 저장하고 반환합니다.
누적 주차 시간이 기본 시간을 초과하지 않았다면 기본 요금(base_cost
)만 result
에 저장하고 반환합니다.
change_minute()
change_minute()
함수는 입력으로 들어오는 time
파라미터를 '분'으로 바꾸어 주는 함수입니다.time
파라미터의 형태는 :
을 기준으로 좌측은 hour
('시'), 우측은 minute
('분')입니다.hour
에 60을 곱하여 '분'으로 만들고 기존의 minute
(분)과 더해주어 반환해줍니다.
solution()
차량 번호에 따른 여러 정보들을 저장하기 위하여 딕셔너리 자료구조를 이용하였습니다.
- car_info : 딕셔너리 자료구조, 차량 번호를 기준으로 비용을 청구할 누적시간(
cost_time
), 입차, 출차 기록을 저장할 변수입니다. - results : 결과를 만들 리스트입니다.
입력으로 들어오는 records
를 반복하면서 record
를 확인합니다.record
를 split()
하여 아래와 같이 분리해줍니다.
time
: 시간car_number
: 차량번호in_out
: IN 또는 OUT
먼저 car_info
에 car_number
가 등록되어 있지 않다면 등록을 해주며 딕셔너리 구조를 만들어줍니다.
초기의 car_info
는 다음과 같습니다.
- 차량번호 :
cost_time
:0
stack
:[]
cost_time
은 비용을 청구할 누적시간을 의미합니다.stack
: in_out에 따라서 값을 저장(append
)하거나 값을 꺼냅니다(pop
)
만약 in_out
이 'IN'이라면 입차를 했다는 의미이고 stack
에 저장합니다.in_out
이 'OUT'이라면 출차를 했다는 의미로 stack
에서 입차시간(in_time
)을 꺼내서 현재 출차 시간(out_time
)을 빼서 누적 주차 시간(cost_time
)을 계산해 줍니다.
모든 반복이 종료되고 나서 차량 번호를 한번씩 더 탐색하는데 이때 stack
이 비었는지 아닌지 확인하며 결과를 만들게 됩니다.
차량번호(car_number
)에 따른 stack
이 빈 리스트([]
)가 아니라면 입차를 했지만 출차는 안했다는 의미로 '23:59'에서 빼주어야 합니다.
위에서 계산된 값을 다시 cost_time
에 저장해주고 모든 차량의 누적시간을 계산하고 비용을 계산합니다.
results
에 (차량번호, 비용)을 저장하고 차량번호를 기준으로 정렬하여 비용(cost
)만을 추출해 result
를 만들고 결과를 반환합니다.
'코딩테스트' 카테고리의 다른 글
[코딩테스트] 백준 안전 영역 파이썬(Python) (0) | 2023.02.25 |
---|---|
[코딩테스트] 프로그래머스 가장 먼 노드 파이썬(Python) (0) | 2023.02.23 |
[코딩테스트] 프로그래머스 미로 탈출 파이썬(Python) (0) | 2023.02.21 |
[코딩테스트] 프로그래머스 카드 뭉치 파이썬(Python) (0) | 2023.02.20 |
[코딩테스트] 백준 결혼식 파이썬(Python) (0) | 2023.02.18 |