hye-log

[프로그래머스]주차 요금 계산(Python) 본문

CodingTest/Programmers

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

iihye_ 2022. 12. 25. 18:06

0. 문제 링크

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

 

프로그래머스

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

programmers.co.kr

 

1. 문제 설명

1) 입차-출차 기록을 이용하여 차랑 별 주차 요금 구하기

2) 입차 후 출차 기록이 없으면 23:59 에 출차하는 것으로 간주

3) 누적 주차 시간이 기본 시간 이하라면, 기본 요금 청구

4) 누적 주차 시간이 기본 시간 초과하면, 기본 요금 + 초과한 시간에 대하여 단위 시간마다 단위 요금 청구

 

2. 입출력

# input
fees = [180, 5000, 10, 600]
records = ["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"]

# output
[14600, 34400, 5000]

 

3. 코드

import math

def timeTominutes(time):
    h, m = map(int, time.split(':'))                        # : 기준으로 시, 분 나누기
    return h * 60 + m

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

    dt, df, ut, uf = fees                                   # 기본 시간, 기본 요금, 단위 시간, 단위 요금
    cars = dict()

    for r in records:
        time, number, inout = r.split()                     # record 하나씩 시간, 번호, 출차 정리

        if number in cars:                                  # 이미 들어온 차이면
            cars[number].append([timeTominutes(time), inout])
        else:                                               # 처음 들어온 차이면
            cars[number] = [[timeTominutes(time), inout]]

    cars_list = list(cars.items())                          # number, [time, inout] 순
    cars_list.sort(key=lambda x: x[0])                      # number 기준으로 정렬

    for car in cars_list:
        t = 0                                               # 누적 주차 시간 계산
        for i in car[1]:
            if i[1] == 'IN':                                # in이면 시간 빼기
                t -= i[0]
            else:                                           # out이면 시간 더하기
                t += i[0]

        if car[1][-1][1] == 'IN':                           # 마지막 기록이 IN 이면
            t += timeTominutes('23:59')                     # 23:59 출차로 간주

        if t <= dt:                                         # 누적 주차 시간이 기본 시간 이하라면
            answer.append(df)                               # 기본 요금 청구
        else:                                               # 누적 주차 시간이 기본 시간을 초과하면
            answer.append(df + math.ceil((t-dt) / ut) * uf) # 기본 요금 + 단위 시간마다 단위 요금 청구

    return answer

 

실행 결과

 

4. 회고

이 문제는 차량의 입출차 시간을 이용하여 주차 요금을 구하는 문제이다. (생각보다 간단했음..)

먼저 주어진 '시:분' 형식을 간단하게 계산하기 위해서 분 단위 시간으로 바꿔주는 함수를 만들었다.

:를 기준으로 시(h), 분(m)으로 나눈 후, h * 60 + m으로 분 단위 시간으로 바꿔준다.

def timeTominutes(time):
    h, m = map(int, time.split(':'))                        # : 기준으로 시, 분 나누기
    return h * 60 + m

다음으로 주어진 records에 대해서 차량 별 입출차 정보를 나타내도록 dictionary를 만들어준다.

record 하나씩 스페이스 바를 기준으로 분리한 다음,

dictionary에 이미 정의된 차량이면 입출차 정보를 append로 추가해주고,

dictionary에 정의되지 않은 차량이면 새롭게 입출차 정보를 리스트 형식으로 추가한다.

cars = dict()

    for r in records:
        time, number, inout = r.split()                     # record 하나씩 시간, 번호, 출차 정리

        if number in cars:                                  # 이미 들어온 차이면
            cars[number].append([timeTominutes(time), inout])
        else:                                               # 처음 들어온 차이면
            cars[number] = [[timeTominutes(time), inout]]

다음으로 dictionary로 정리한 입출차 정보를 items()를 이용하여 리스트 형식으로 가져오고, 차량번호를 기준으로 정렬한다.

cars_list = list(cars.items())                          # number, [time, inout] 순
cars_list.sort(key=lambda x: x[0])                      # number 기준으로 정렬

차량 별 주차요금을 계산하는 부분이다.

누적 주차 시간을 계산하기 위해서 t를 정의하고 0으로 초기화해준다.

만약 차량이 IN이면 시간을 빼고, OUT이면 시간을 더해준다.

차량이 IN했지만 OUT하지 않은 경우 OUT 시간은 23:59 로 간주한다.

누적 주차 시간이 기본 시간 이하라면, 기본 요금을 청구하고,

누적 주차 시간이 기본 시간 초과하면, 기본 요금에 초과 시간에 대해 단위 시간 마다 단위 요금을 청구한다.

이때, 초과 시간을 단위 시간으로 나눌 때는 올림으로 처리한다.

    for car in cars_list:
        t = 0                                               # 누적 주차 시간 계산
        for i in car[1]:
            if i[1] == 'IN':                                # in이면 시간 빼기
                t -= i[0]
            else:                                           # out이면 시간 더하기
                t += i[0]

        if car[1][-1][1] == 'IN':                           # 마지막 기록이 IN 이면
            t += timeTominutes('23:59')                     # 23:59 출차로 간주

        if t <= dt:                                         # 누적 주차 시간이 기본 시간 이하라면
            answer.append(df)                               # 기본 요금 청구
        else:                                               # 누적 주차 시간이 기본 시간을 초과하면
            answer.append(df + math.ceil((t-dt) / ut) * uf) # 기본 요금 + 단위 시간마다 단위 요금 청구

 

5. Github

https://github.com/iihye/Algorithm/blob/main/Programmers/calc_parkingfee.py

 

GitHub - iihye/Algorithm: [💌] Solving algorithm problems

[💌] Solving algorithm problems. Contribute to iihye/Algorithm development by creating an account on GitHub.

github.com

 

728x90
Comments