알고리즘/카카오기출

[Python] programmers 주차요금계산

정찡이 2022. 1. 22. 12:38
728x90

1. 문제 링크

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

 

코딩테스트 연습 - 주차 요금 계산

[180, 5000, 10, 600] ["05:34 5961 IN", "06:00 0000 IN", "06:34 0000 OUT", "07:59 5961 OUT", "07:59 0148 IN", "18:59 0000 IN", "19:09 0148 OUT", "22:59 5961 IN", "23:00 5961 OUT"] [14600, 34400, 5000]

programmers.co.kr

 

2. 문제 요약

  • 차량 번호가 작은 자동차부터 청구할 주차 요금을 차례대로 정수 배열에 담아서 return
  • 출차된 내역이 없는 경우, 23:59에 출차된 것으로 간주
  • 초과한 시간이 단위 시간으로 나누어 떨어지지 않으면, 올림

3. 아이디어 정리

  1. records를 통해 총 주차 시간 구하기
  2. 출차를 안 한 경우 처리
  3. 차량별 요금 계산하기
  4. 차량 번호 정렬 후 주차 요금 리턴

 

4. 문제 풀이

4-1. 내풀이

from collections import defaultdict
import math

def solution(fees, records):
    """
    :param fees: 기본 시간(분) 기본 요금(원)	단위 시간(분)	단위 요금(원)
    :param records: 시각, 차량번호, 내역
    :return: 차량 번호가 작은 자동차부터 청구할 주차 요금을 차례대로 정수 배열에 담아
    """

    def get_minute(time):
        h, m = time.split(":")
        return int(h) * 60 + int(m)

    answer = list()
    parking = dict()
    total = defaultdict(int)

    # 1. records를 통해 총 주차 시간 구하기
    for r in records:
        t, n, f = r.split()  # 시각, 차량번호, 내역
        minute = get_minute(t)   # 분으로 변환
        if n in parking:  # 이미 입차한 경우, 출차로 총 시간 측정
            total[n] += minute - parking[n]
            del parking[n]
        else:   # 입차인 경우
            parking[n] = minute

    # 2. 출차를 안 한 경우 처리
    end_minute = get_minute('23:59')
    for k, v in parking.items():
        total[k] += (end_minute - v)

    # 3. 요금 계산하기
    s1, m1, s2, m2 = fees   # 기본 시간(분) 기본 요금(원) 단위 시간(분) 단위 요금(원)
    for k, v in total.items():
        all = m1  # 기본요금 내기
        if v > s1:
            all += math.ceil((v - s1) / s2) * m2
        answer.append((k, all))

    answer.sort()
    return [a[1] for a in answer]

 

 

5. 결론

  • 구현