본문 바로가기

코딩테스트 문제

[Python] 프로그래머스 - 주차요금 계산

프로그래머스 - 주차요금계산 / 문제 유형 : 구현, 해시맵 / 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

 

질문이나 궁금하신점 또는 제가 잘못 알고있는 정보는 댓글 부탁드립니다😊