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

Sujin Lee·2022년 10월 21일
0

코딩테스트

목록 보기
146/172
post-thumbnail
post-custom-banner

문제

프로그래머스 - 주차 요금 계산

해결 과정

  • 천천히 구현하는 것
  • toMinute: 문자열을 받아서 분으로 변환하는 함수
  • for문을 통해서 records 원소를 공백을 기준으로 자른다.
    • key 는 차 번호
    • values 에는 리스트로 넣는데, [시간, 입차or출차]
    • dic = {5961: [[334, 'IN'], [479, 'OUT'], [1379, 'IN'], [1380, 'OUT']], 0: [[360, 'IN'], [394, 'OUT'], [1139, 'IN']], 148: [[479, 'IN'], [1149, 'OUT']]}
  • 차량 번호가 작은 자동차부터 청구할 주차 요금을 차례대로 정수 배열에 담아서 return 하도록 solution 함수를 완성해주세요. 조건에 의해 정렬 필요
    • 차량 번호를 기준으로 정렬을 해야하기 때문에 리스트를 만들 때 key + value가 필요하다 -> dic.items()
    • 차량 번호를 기준으로 정렬 -> key=lambda x : x[0]
    • sortList = [(0, [[360, 'IN'], [394, 'OUT'], [1139, 'IN']]), (148, [[479, 'IN'], [1149, 'OUT']]), (5961, [[334, 'IN'], [479, 'OUT'], [1379, 'IN'], [1380, 'OUT']])]
  • 총 누적 시간 계산하는 반복문
    • 차량 번호 별로 계산하는 반복문
      • 입차일 때 시간을 빼주고 출차일 때 시간을 더해준다.
    • 출차된 내역이 없는 경우 = 마지막 값이 "IN"인 경우
      • "23:59"를 출차 시간으로 더 해준다.
    • 기본 시간보다 작으면 기본 요금을 지불하고 아니면 계산 값을 append

풀이

import math

# 20:20 -> 분으로 변환해주는 함수 
def toMinute(s):
    h,m = map(int,s.split(":"))
    return (h * 60) + m

def solution(fees, records):
    answer = []
    # 기본 시간, 기본 요금, 단위 시간, 단위 요금 순
    dt, df, ut, uf = fees
    dic = dict()
    # dic = {5961: [[334, 'IN'], [479, 'OUT'], [1379, 'IN'], [1380, 'OUT']], 0: [[360, 'IN'], [394, 'OUT'], [1139, 'IN']], 148: [[479, 'IN'], [1149, 'OUT']]}
    for i in records:
        time, number, history = i.split()

		# 나중 정렬을 위해 int형으로 변환
        number = int(number)
        if number in dic:
            dic[number].append([toMinute(time), history])
        else:
            dic[number] = [[toMinute(time),history]]
            
    sortList = list(dic.items())
    # 차 번호 기준으로 정렬
    sortList.sort(key=lambda x : x[0])
    
    for i in sortList:
        t = 0
        for j in i[1]:
            if j[1] == 'IN':
                t -= j[0]
            else:
                t += j[0]
        # 출차된 내역이 없을 경우
        if i[-1][-1][1] == 'IN':
            t += toMinute("23:59")
            
        # 기본 시간보다 작으면 기본 요금 지불
        if t <= dt:
            answer.append(df)
        else:
            answer.append(df + (math.ceil((t - dt) / ut)) * uf)
                    
    return answer
profile
공부한 내용을 기록하는 공간입니다. 📝
post-custom-banner

0개의 댓글