본문 바로가기

개발/algorithm

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

문제 링크

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

 

풀이 

- 이렇게 푸는 게 맞나 싶었다.........

- 딕셔너리를 이용해서 풀었다. defaultdict 에 조금 익숙해지고 나니깐 되게 자주 사용하게 되는 듯하다 

- result 는 자동차 번호 별 총 주차 시간을 기록 

- t_record는 자동차 번호 별 입차 시간을 기록 

1. 'IN'이라면 시간을 분으로 표시하여 t_record에 저장한다. 이 때 key는 주차번호를 정수형으로 바꿔주어야 나중에 자동차 번호가 작은 거부터 정렬이 가능하다. 아니면 문자열 정렬을 하게 된다. 

2. 'OUT'이라면 t_record에서 입차 시간을 빼고(pop) 주차 시간(출차시간 -입차시간)을 계산하여 result에 더한다. 

3. 만약 t_record에 입차 기록이 남아있다면 출차한 기록이 없다는 것이므로 23:59에 출차한 것으로 계산하여 result 에 더한다.

4. 자동차 번호인 t_record의 key를 기준으로 오름차순 정렬한다.

5. 총 주차시간이 기본 시간보다 작거나 같으면 기본 요금을 answer에 추가 한다.

    총 주차시간이 기본 시간보다 크면 조건에 맞게 계산하여 answer에 추가한다. 

from collections import defaultdict 
import math 

def solution(fees, records):
  answer = []
  # 총 주가 시간 기록 
  result = defaultdict(int)
  # 입차 시간 기록 
  t_record = dict()

  for i in records:
    s = i.split()
    # 입차 시간 기록 
    if s[2] == 'IN':
      h, m = map(int, s[0].split(":"))
      # 계산하기 편하도록 모두 분으로 변경 
      t_record[int(s[1])] = h*60 + m
    else :
      h, m = map(int, s[0].split(":"))
      # 출차시간에서 입차시간을 빼고 그 값을 result[차번호]에 더한다
      result[int(s[1])] += (h*60 + m)- t_record.pop(int(s[1]))

  # 입차 시간이 남아있다면 23:59에 나간 것으로 계산 
  for i in t_record.keys():
    result[i] += (23*60 + 59) - t_record[i]
  
  # 차번호 기준으로 정렬 
  result = sorted(result.items(), key = lambda x : x[0])
  
  for i in result:
    # 기본 시간보다 주차시간이 작거나 같으면 기본 요금 
    if i[1] <= fees[0]:
      answer.append(fees[1])
    # 기본 시간보다 주차 시간이 길면 조건에 맞게 요금 계산 
    else:
      answer.append(fees[1] + (math.ceil((i[1]-fees[0])/fees[2])) * fees[3])
  
  return answer