본문 바로가기

알고리즘

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

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

 

프로그래머스

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

programmers.co.kr

문제


주차 요금표가 주어지고 입출차 기록 (in,out)이 주어졌을때 주차요금을 계산하는 문제이다.

 

입력


fees, records 리스트가있다.fees 의 길이 4

  • 1 ≤ fees[0] ≤ 1,439
  • 0 ≤ fees[1] ≤ 100,000
  • 1 ≤ fees[2] ≤ 1,439
  • 1 ≤ fees[3] ≤ 10,000

records 의 길이 <= 1000, 문자열 형식으로 시각과 차번호 in out 중하나가 적혀있다.

 

출력


차 번호표의 수가 작은 순서대로 내야할 금액의 리스트를 반환한다.

 

풀이


먼저 in 일때와 out 일때를 나눠서 각각 할일을 적었다. in 일때는 시작 시간이다. 시간길이 = 마지막시간 - 시작시간 이므로 records 에 적힌 시간이 시작시간이므로 누적된 시간 에 recoreds 시간을 빼줬다. 그리고 누적 시간은 시간 길이들을 더해줘야하므로 사실상 더해주기만 하면된다. 

 

따라서 in 일때는 누적시간 - 시작시간

 

out 일때 는 마지막 즉 나가는 시간이다. 이때는 누적 시간에 recoreds 시간을 더해주기만 하면된다. 그러면 마지막 시간 - 시작 시간이 된다. 

 

out 일때 누적시간 + 마지막시간

 

나열해보면 (마지막 시간 - 시작시간) = 누적시간 + (마지막시간 - 시작시간)

 

그리고 차량 번호에 맞게 오름차순으로 정렬해준다.

 

마지막까지 출차 즉 out 을 안한 차는 마지막 시간을 더해줬다. 여기사 말하는 마지막시간은 23:59 이다.

import math # 올림을 위해 임포트
def cusTime(time): # 시간을 숫자로 풀어서 표현
    time = time.split(":")
    return int(time[0]) * 60 + int(time[1])

def parkingFeeCalc(fees,durTime): # 주차비 계산 공식
    return fees[1] + math.ceil((durTime - fees[0]) / fees[2]) * fees[3]
    
def solution(fees, records):
    answer = []
    carDict = {}
    for record in records: # records 배열에 저장된 것들을 돌린다.
        splitRecord = record.split() # 공백으로 나눠서 리스트로 저장
        if splitRecord[-1] == 'IN': # in 일때
            if splitRecord[1] in carDict: 
                sumCarTime = carDict[splitRecord[1]][0] - cusTime(splitRecord[0]) # 누적시간 - 시작시간
                carDict[splitRecord[1]] = [sumCarTime,"IN"] # 딕셔너리 저장
            else: 만약 딕셔너리에 해당 차량 번호가 없다면
                carDict[splitRecord[1]] = [-cusTime(splitRecord[0]),"IN"] # 누적시간이 없으므로 누적시간을 0으로 설정하여 그냥 빼준다.
        elif splitRecord[-1] == 'OUT': # out 일때
            durTime = cusTime(splitRecord[0]) + carDict[splitRecord[1]][0] # 누적시간 + 마지막 시간
            carDict[splitRecord[1]] = [durTime,"OUT"] # 저장
            
    carDict = sorted(carDict.items(), key = lambda item: item[0]) # 차량 번호로 정렬
    
    for carName,carData in carDict: # 차량 번호로 정렬된 순으로 반복
        if carData[1] == "IN": # 아직 out이 안된 차량이 있다면 
            sumOfParkingTime = carData[0] + cusTime("23:59") # 누적시간 + 마지막 시간 (23:59)
            if sumOfParkingTime <= fees[0]: # 만약 기본시간 보다 더빨리 나갔다면
                res = fees[1] # 기본요금으로 낸다.
            else:
                res = parkingFeeCalc(fees,sumOfParkingTime) # 아니라면 계산된 요금
            answer.append(res)
            
        else:
            sumOfParkingTime = carData[0]
            if sumOfParkingTime <= fees[0]: # 만약 기본시간 보다 더빨리 나갔다면
                res = fees[1] # 기본요금으로 낸다.
            else:
                res = parkingFeeCalc(fees,sumOfParkingTime) # 아니라면 계산된 요금
            answer.append(res)
    return answer