프로그래머스 - 주차요금계산 / 문제 유형 : 구현, 해시맵 / 2022 KAKAO BLIND RECRUITMENT / Level2
2022 KAKAO BLIND RECRUITMENT에서 나온 문제이다.
문제 바로가기 - https://school.programmers.co.kr/learn/courses/30/lessons/92341
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
문제
자세한 문제 설명 및 조건, 입출력에 대한 설명은 문제에서 확인바란다.
Solution
문제가 좀 길은 것 같았으나 생각보다 구현은 간단하였다.
우선, 딕셔너리를 2개 생성하였다.
- 딕셔너리 1 (car_fee) : { 차량번호 : 요금 }
- 딕셔너리 2 (car) : { 차량번호 : [입출차 시간 정보]}
1. 데이터 저장
record를 돌면서 각각 시간, 차량번호, 상태를 딕셔너리2에 저장해주었다. 여기서 상태는 필요하진 않았지만, split()한 값을 저장하는 용도로만 사용하였다.
(상태(IN-OUT)이 필요하지 않은 이유는 출차를 먼저하는 경우와 입차를 두번하는 경우가 없기 때문이다. 무조건 입차-출차 순서이기에 필요하지 않았다. )
2. 시간 계산
다음은 이 딕셔너리2(car)를 돌면서 시간과 해당 요금을 계산해준다.
키에 해당하는 값으로 입출차 정보가 담긴 리스트가 들어있기 때문에, 해당 리스트의 길이가 홀수이면 이 차량은 마지막에 입차만 완료된 상태이다. (출차 X, 입차-출차 순서대로 이루어지기에 홀수인 경우는 입차만 된 경우)
이 상태에서는 23:59분에서 입차시간을 뺀 시간을 계산한 후 sumtime이라는 변수에 더한다.
기본 단위가 (분)이기 때문에 (시)->(분)으로 바꿔주어 계산하였다.
다음 등록된 입차-출차 된 각각의 요금을 계산해준다
입차-출차가 한 쌍이므로 for문이 도는 단위를 2로 변경해주었다.
그다음 출차에서 입차한 시간을 계산하여 sumtime에 더해준다.
3. 요금계산
위에서 더한 sumtime으로 기본시간과 비교한다.
sumtime<fees[0] : 기본시간보다 작을 때는 기본요금을 더해준다
else : 기본시간보다 초과시 기본요금+초과요금을 계산해서 더해준다.
4. 정렬
sorted함수를 이용해 키값인 차량 번호를 작은 순서대로 정렬해준뒤(요금을 출력해야 하므로 car_fee를 정렬함)
딕셔너리1 car_fee를 돌면서 해당 요금을 answer에 append해준다
from collections import defaultdict
import math
def solution(fees, records):
answer = []
car_fee = defaultdict(int)
car = defaultdict(list) # {차량번호:[차량 입출차 시간,..,]}
for r in records:
time,car_num,status = r.split()
car[car_num].append(time)
for k in car.keys():
times = list(car[k])
sumtime = 0
# 마지막 입차시간 계산
if len(times)%2 != 0: # 리스트의 길이가 홀수인 것은 입차만 하고 출차하지 않은 상태
last_in = times.pop() # 마지막으로 입차한 시간
in_h,in_m = map(int,last_in.split(":"))
out_h,out_m = 23,59
sumtime += (out_h-in_h)*60 + out_m-in_m # 전체 시간 += 23:59 - 마지막 입차시간
#등록된 입출차 시간 계산
for t in range(0,len(times),2):
in_h,in_m = map(int,times[t].split(":"))
out_h,out_m = map(int,times[t+1].split(":"))
sumtime += (out_h-in_h)*60 + out_m-in_m
fee = 0
# 기본요금 청구
if sumtime < fees[0]: fee += fees[1]
else : #기본요금 + 추가 이용금액
fee += fees[1]
fee += math.ceil((sumtime-fees[0])/fees[2])*fees[3]
car_fee[k] = fee
d = dict(sorted(car_fee.items())) #차량번호가 작은 것으로 정렬
for f in d.keys():
answer.append(car_fee[f])
return answer
질문이나 궁금하신점 또는 제가 잘못 알고있는 정보는 댓글 부탁드립니다😊
'코딩테스트 문제' 카테고리의 다른 글
[코드트리] 삼성 SW 역량테스트 2022 상반기 오전 2번 문제 - 예술성 (0) | 2023.04.06 |
---|---|
[Python] 프로그래머스 - 튜플(2019 카카오 개발자 겨울 인턴십) (0) | 2022.10.05 |
[Python] 프로그래머스 - 성격 유형 검사하기(2022 KAKAO TECH INTERNSHIP) (0) | 2022.09.17 |
[Python] 프로그래머스 - 신고 결과 받기(2022 KAKAO BLIND RECRUITMENT) (2) | 2022.09.16 |
[Python] 프로그래머스-소수만들기(Summer/Winter Coding(~2018)) (2) | 2022.09.15 |