종식당

[프로그래머스 lv.1] 2022 KAKAO BLIND RECRUITMENT 주차 요금 계산 본문

프로그래머스

[프로그래머스 lv.1] 2022 KAKAO BLIND RECRUITMENT 주차 요금 계산

종식당 2024. 4. 5. 23:16
728x90
반응형

https://school.programmers.co.kr/learn/courses/30/lessons/92341

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

  • 문제 설명
    차량의 출차기록에 따른 주차 요금을 계산하면 되는 문제다. 먼저 fees리스트에 요금표의 정보가 저장되어 있고 records리스트에 차량의 입/출차 기록이 저장되어 있다.
    누적 주차 시간에 따라서 주차 요금이 정해지는데 누적 주차 시간이 기본 시간보다 작거나 같으면 기본요금을 반환하면 되고 누적 주차 시간이 더 크면 기본요금에서 초과한 시간에 대해 단위 시간마다 단위 요금을 청구하여 계산 후 반환하면 된다.

  • 제출 코드
import math
from collections import defaultdict

def solution(fees, records):
    answer = []
    records_dict = defaultdict(list)

    for i in records:
        time, number, record = i.split(" ")
        hour, minute = map(int, time.split(":"))
        time = hour * 60 + minute
        records_dict[number].append(time) #시간 계산 후 저장
        
        
    for i in records_dict:
        if len(records_dict[i])%2 == 1: #입차 기록이 마지막이고 출차 기록이 없을 때
            records_dict[i].append(23*60+59)
    cars = sorted(records_dict.keys())
    
    for car in cars:
        money = 0
        time = sum(records_dict[car][1::2]) - sum(records_dict[car][::2]) #총 출차 시간에서 입차 기록 빼기
        if time > fees[0]:
            money+=fees[1]+math.ceil((time-fees[0])/fees[2])*fees[3]
        else:
            money+=fees[1]
        
        answer.append(money)
    return answer

 

먼저 요금을 계산할 때 올림 함수를 사용하기 위해서 math라이브러리를 호출했다. 그리고 차량 별로 입출차 기록을 딕셔너리에 저장하기 위해 collections라이브러리에서 defaultdict를 호출했다. 그리고 이를 list로 타입을 지정해 주고 for문으로 records리스트를 돌면서 spilt을 이용해 시간 정보를 각각 추출해 주었다.
이전에 시간 관련 문제를 풀었던 적이 있었는데 그때 시간문제는 무조건 단위를 통일해서 풀라는 말이 너무 인상 깊어서 이를 떠올려서 단위를 분으로 통일해 주었다. 이때, 나는 ":"를 기준으로 split을 이용하여 풀었는데 그냥 문자열에서 파싱을 통해 이를 구할 수도 있다는 점을 생각하고 넘어가도록 하자.

시간을 통일하여 구했으면 이를 딕셔너리에 저장해 준다. defaultdict를 이용해서 선언했으니 key가 없더라도 오류가 일어나지 않는다. 차량번호를 key, 시간을 value로 딕셔너리에 저장한다.

딕셔너리에 records에 있는 차량들의 시간을 모두 저장하고 이를 for문으로 돌면서 이 차량이 입차 기록이 마지마 기록인지, 출차 기록이 마지막 기록인지에 대해 판단 후 입차 기록이 마지막이면 
00:00부터 23:59까지의 입/출차 내역을 바탕으로 차량별 누적 주차 시간을 계산하여 요금을 일괄로 정산합니다.
위 문장에 따라서 23:59를 분으로 바꾸어 append 해 준다.

이제 요금을 계산한 후 리스트를 반환해 줄 건데 차량번호가 작은 자동차부터 정렬하여 요금을 반환해야 하니 이를 정렬해 준다. 

마지막으로 for문을 통해 차량 번호가 낮은 차부터 시간을 계산하여 요금을 계산한다.

time = sum(records_dict[car][1::2]) - sum(records_dict[car][::2])

 

짝수 번째 숫자를 모두 더한 값에서 홀수 번째 숫자를 모두 더한 값을 빼준다. 짝수번째에는 모두 출차 기록이 저장되어 있고 홀수 번째 숫자에는 모두 입차 기록이 저장되어 있으니 위 계산 식을 통해 누적 주차 시간을 알 수 있다.

그리고 이 시간이 기본시간 보다 크다면 주어진 조건에 따라 계산 후 주차 요금을 저장하고 기본 시간보다 작거나 같다면 기본요금을 저장 후 리스트를 반환해 준다.


  • 마무리
    문제를 풀면서 딕셔너리를 사용해야 하는 경우가 많은데 이때 꼭 defaultdict를 생각한 후 유용하게 쓸 수 있다면 이를 꼭 사용하면 좋겠다는 생각을 했다.
728x90
반응형