일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 백트랙킹
- 파이썬 #알고리즘 #코딩테스트 #프로그래머스
- 파이썬
- Dijkstra
- java #자바 #나동빈
- DFS
- css #생활코딩 #웹
- 자바 #java
- BFS
- react #리액트 #동빈나
- 파이썬 #백준 #알고리즘 #코딩테스트
- 다이나믹프로그래밍
- PYTHON
- css #웹 #생활코딩
- 코딩테스트
- java #자바
- 다익스트라
- 재귀
- dp
- 투포인터
- 백준
- 알고리즘
- java #자바 #동빈나
- 프로그래머스
- 백준 #알고리즘 #파이썬 #코딩테스트
- java #자바 #생활코딩
- 프로그래머스 #파이썬 #코딩테스트 #알고리즘
- 프로그래머스 #파이썬 #알고리즘 #코딩테스트
- 백준 #파이썬 #알고리즘 #코딩테스트
- react #리액트 #동빈나 #나동빈 #유튜브강의
Archives
- Today
- Total
커리까지
[프로그래머스] 2022 카카오 블라인드 주차 요금 계산 본문
728x90
SMALL
- 문제가 너무 길어서 링크로 대체
제출 답안
언뜻 보면 어려울 것 같지만 시간 변환과 in, out 관리만 잘해주면 쉽게 풀 수 있다.
set_car_info
- 처음 주차 했을 때 가져야 할 기본 값들을 지정해 놓았다.
- 만약에
parking
에 차 번호가 없으면 이 함수의 리턴값을 기본 값으로 가지도록 하였다.
cal_time
- 시간의 범위를 계산하는 함수이다.
OUT
일 때만 계산하기 때문에 차 번호의 이전 주차 시간이랑 현재 주차 시간을 매개변수로 사용한다.- 시간에 60을 곱해서 분으로 만들고 minute랑 더해서 지금 시간 - 이전 시간을 리턴한다.
cal_fees
- 주차 비용을 계산하는 함수이다.
- 문제에서 주어진 fees를 각각 변수에 할당한다.
- 기본 시간이랑 현재 차 번호가 주차한 시간을 계산한다.
- 기본 시간 이하면 기본 비용을, 기본 시간 이상이면 추가 비용을 계산해서 리턴한다.
- 여기서
math.celi
을 사용하면 값을 올림한다.
- 여기서
solution
parking
은 주차 정보를 담는다.answer
는 최종 비용을 담는다.not_out_number
는 마지막까지 출차하지 않은 차 번호를 담는다.- deque로 생성한 이유는 빈번하게 삽입, 삭제가 진행되기에 선택하였다.
- 먼저 주차 기록을
:
으로 split한다. - 차의 정보를 가져온다.
- 처음 주차는 기본 정보를, 이미 주차했던 경우는 기존 내역을 가져오게 된다.
- 만약 차가 출차하는 경우라면 주차 시간을 계산하여 기존 주차 시간에 합산하고,
not_out_number
에서 차 번호를 삭제한다. - 주차하러 들어온 경우
not_out_number
에 차 번호를 추가한다. - 만약 마지막까지 출차하지 않았으면
23:59
와 기존 주차 시간을 계산하여 주차 시간에 합산한다. - 차 번호대로 오름차순을 수행한다.
parking
의 values를 순회하며 주차비를 계산하고,answer
에 삽입한다.- 마지막으로
answer
를 리턴한다.
from collections import deque
import math
def set_car_info(parking_time, in_out):
return {"parking_time" : parking_time, "in_out" : in_out, "parking_range" : 0}
def cal_time(before, after):
before_hour, before_minute = before.split(":")
after_hour, after_minute = after.split(":")
before_time = int(before_hour) * 60 + int(before_minute)
after_time = int(after_hour) * 60 + int(after_minute)
return after_time - before_time
def cal_fees(parking_range, fees):
default_time, default_fee, add_time, add_fee = fees
diff_time = default_time - parking_range
if 0 <= diff_time:
return default_fee
else:
total_fee = default_fee + math.ceil(abs(diff_time) / add_time) * add_fee
return total_fee
def solution(fees, records):
parking = {}
answer = []
not_out_number = deque()
for record in records:
parking_time, car_number, in_out = record.split(" ")
car_info = parking.get(car_number, set_car_info(parking_time, in_out))
if in_out == 'OUT':
car_info["parking_range"] += cal_time(car_info["parking_time"], parking_time)
not_out_number.remove(car_number)
elif in_out == 'IN':
not_out_number.append(car_number)
parking[car_number] = {**car_info, "parking_time" : parking_time, "in_out" : in_out}
for car_number in not_out_number:
parking[car_number]["parking_range"] += cal_time(parking[car_number]["parking_time"], "23:59")
parking = dict(sorted(parking.items()))
for value in parking.values():
total_fee = cal_fees(value['parking_range'], fees)
answer.append(total_fee)
return answer
728x90
LIST
'알고리즘 > 풀이' 카테고리의 다른 글
[프로그래머스] 다음 큰 숫자 (1) | 2022.10.08 |
---|---|
[프로그래머스] 피보나치 수 (1) | 2022.10.08 |
[프로그래머스] 괄호 회전하기 (1) | 2022.10.05 |
[프로그래머스] 영어 끝말잇기 (0) | 2022.10.02 |
[프로그래머스] 숫자의 표현 (0) | 2022.10.01 |
Comments