본문 바로가기
프로그래머스/Python

[프로그래머스] 주차 요금 계산 - 파이썬(Python) - 우당탕탕 개발자 되기 프로젝트

by 우당탕탕 개발자 2023. 8. 14.
728x90
반응형

 

 

프로그래머스

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

programmers.co.kr

 

1. 문제 설명

2. 풀이과정

  1. 요금 청구를 할 때 올림 함수 ceil()을 사용하기 위해 math 모듈을 불러온다. import math
  2. 자동차의 입차와 출차 내역을 저장할 딕셔너리를 생성한다. d = {}
  3. 각 자동차 별로 누적 주차 시간을 저장할 딕셔너리를 생성한다. minute = {}
  4. 입차와 출차 정보를 담은 정보를 하나씩 추출한다. for i in records
  5. 공백으로 각 정보가 구분되어 있기 때문에 분리하여 따로 저장해 준다. time, num, op = i.split()
  6. 시간은 다시 시와 분으로 나눠 저장해 준다. hour, min = time.split(":")
  7. 만약 해당 차량이 입차하는 것이라면 if (op == 'IN')
  8. 차 번호를 key로 하고 입차 시간을 분으로 환산한 결과를 value로 저장한다. d[num] = int(hour) * 60 + int(min)
  9. 분으로 환산한 결과를 저장하는 이유는 나중에 누적 주차 시간단순 뺄셈으로 변하게 구하기 위해서다.
  10. 반면에 해당 차량이 출차하는 것이라면 else
  11. 주차 시간을 구한다. total = (int(hour) * 60 + int(min)) - d[num]
  12. 주차 시간은 입차 시간에서 출차 시간을 빼주면 되는데 출차 시간도 분으로 환산하여 그 결과를 활용한다.
  13. 만약 해당 번호의 차량이 처음 출차하는 것이 아니라면 if (num in minute)
  14. 해당 차량의 누적 주차 시간에 시간을 추가해 준다. minute[num] += total
  15. 반면에 해당 번호의 차량이 처음 출차하는 것이라면 else
  16. 해당 차량의 번호를 key로 하고 주차 시간을 value로 저장한다. minute[num] = total
  17. 출차한 차량의 key(번호)를 제거한다. del d[num]
  18. 모든 입차, 출차 내역을 확인한 뒤, 만약 아직 출차하지 않은 차량이 있다면 하나씩 추출하여 for i in d
  19. 23시 59분에 출차한 것으로 판단하고 주차 시간을 계산한다. total = (23 * 60 + 59) - d[i]
  20. 만약 해당 번호의 차량이 처음 출차하는 것이 아니라면 if (i in minute)
  21. 해당 차량의 누적 주차 시간에 시간을 추가해 준다. minute[i] += total
  22. 반면에 해당 번호의 차량이 처음 출차하는 것이라면 else
  23. 해당 차량의 번호를 key로 하고 주차 시간을 value로 저장한다. minute[i] = total
  24. 차량 번호가 작은 자동차부터 주차 요금을 저장해야 하므로 차량 번호인 key를 기준으로 오름차순 정렬해 준다. minute = sorted(minute.items())
  25. 정렬한 결과를 하나씩 추출하여 for i in minute
  26. 만약 누적 주차 시간이 기본 시간을 초과했다면 if (i[1] > fees[0])
  27. 기본 요금에 초과한 시간의 단위 시간마다 단위 요금을 더해 청구한다. 초과한 시간이 단위 시간으로 나누어 떨어지지 않으면 올림 하여 계산한다. cost = math.ceil((i[1] - fees[0]) / fees[2]) * fees[3] + fees[1]
  28. 반면에 누적 주차 시간이 기본 시간 이하라면 else
  29. 주차 요금은 기본 요금이 된다. cost = fees[1]
  30. 계산한 주차 요금을 정답 리스트에 추가해 준다. answer.append(cost)
반응형

3. 소스코드

import math

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

    d = {}
    minute = {}
    for i in records:
        time, num, op = i.split()
        hour, min = time.split(":")
        if (op == 'IN'):
            d[num] = int(hour) * 60 + int(min)
        else:
            total = (int(hour) * 60 + int(min)) - d[num]
            if (num in minute):
                minute[num] += total
            else:
                minute[num] = total

            del d[num]

    for i in d:
        total = (23 * 60 + 59) - d[i]
        if (i in minute):
            minute[i] += total
        else:
            minute[i] = total

    minute = sorted(minute.items())
    for i in minute:
        if (i[1] > fees[0]):
            cost = math.ceil((i[1] - fees[0]) / fees[2]) * fees[3] + fees[1]
        else:
            cost = fees[1]

        answer.append(cost)

    return answer
728x90
반응형