새소식

⌨️ Algorithms/프로그래머스

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

2022. 10. 14. 22:35

  • -

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

 

프로그래머스

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

programmers.co.kr

 

"""
입출력 예시)

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"] -> [14600, 34400, 5000]
fees = [120, 0, 60, 591], records = ["16:00 3961 IN","16:00 0202 IN","18:00 3961 OUT","18:00 0202 OUT","23:58 3961 IN"] -> [0, 591]
fees = [1, 461, 1, 10], records = ["00:00 1234 IN"] -> [14841]
"""

import math

# 시각을 분으로 변환하는 함수
def time_to_min(time):
    h, m = map(int, time.split(':'))
    return h*60 + m

def solution(fees, records):
    answer = []
    # 기본 시간, 기본 요금, 단위 시간, 단위 요금
    dt, df, ut, uf = fees
    dic = {} # 차량번호별 입/출차 내역을 담을 dict
    
    for r in records:
        #시각, 차량번호, 내역
        time, car_num, in_out = r.split()
        car_num = int(car_num)
        
        if car_num not in dic: # 차량번호가 dic에 없는 경우
            dic[car_num] = [[time_to_min(time), in_out]] # key:차량번호, value:[[시각(분), 내역]]
        else: # 차량번호가 dic에 있는 경우
            dic[car_num].append([time_to_min(time), in_out])
            
    # 차량번호가 작은 자동차부터 청구할 주차 요금을 차례대로 정수 배열에 담기 위해 dic을 리스트로 변환
    dic_list = list(dic.items()) # 차량번호별로 시각과 내역을 담은 리스트 
    # -> [(차량번호, [[시각(분), 내역], [시각(분), 내역], [시각(분), 내역], [시각(분), 내역]]), ()]
    dic_list.sort(key=lambda x : x[0]) # 차량번호 기준으로 오름차순 정렬
    
    for d in dic_list:
        total_t = 0 # 누적 주차 시간
        
        for time_his in d[1]: # time_his -> [시각(분), 내역]
            # 시각(분), 내역
            t, his = time_his
            if his == 'IN': # 내역이 'IN'인 경우
                total_t -= t # 누적 주차 시간 = 누적 주차 시간 - 시각(분)
            else: # 내역이 'OUT'인 경우
                total_t += t # 누적 주차 시간 = 누적 주차 시간 + 시각(분)
                
        if d[1][-1][1] == 'IN': # 마지막 내역이 'IN'인 경우(출차된 내역이 없을 때)
            total_t += time_to_min('23:59') # 누적 주차 시간 = 누적 주차 시간 + 23:59를 분으로 변환한 값
        
        if total_t <= dt: # 누적 주차 시간이 기본 시간과 작거나 같은 경우
            answer.append(df) # 주차 요금 = 기본 요금
        else: # 누적 주차 시간이 기본 시간보다 큰 경우
            # 주차 요금 = 기본 요금 + ((누적 주차 시간 - 기본 시간)/단위 시간) * 단위 요금
            total_fee = df + math.ceil((total_t-dt)/ut) * uf 
            answer.append(total_fee)
    
    return answer

 

  • list.sort()와 sorted(list) 차이
    • list.sort(key=None, reverse=False)
      • 원본 리스트의 순서를 자체를 변경 (원본 리스트에 영향 O)
      • 반환 값이 None
      • 새로운 복사본을 만들지 않아 sorted(list)보다 빠름
    • sorted(iterable, key=None, reverse=False)
      • 정렬된 새로운 리스트를 반환 (원본 리스트에 영향 X)
      • 모든 iterable에 사용 가능 (list, tuple, dict, str, ...)
  • dic.items()
    • 딕셔너리에 저장된 모든 Key값과 Value값 출력
    • -> [(key, value), (key, value), ...]
  • math.ceil()
    • 실수를 입력하면 올림해서 정수를 반환
    • 괄호 안의 수는 float 타입의 실수를 입력
    • 정수를 입력하면 아무런 변화 없이 정수를 그대로 반환함

 

 

 

 

 

참고)

 

https://velog.io/@minnseong/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%EC%A3%BC%EC%B0%A8-%EC%9A%94%EA%B8%88-%EA%B3%84%EC%82%B0

 

프로그래머스 : 주차 요금 계산 (python)

프로그래머스 2022 KAKAO BLIND RECRUITMENT Level 2 주차 요금 계산 - python

velog.io

 

https://inma.tistory.com/137

 

[Python] list.sort()와 sorted(list) 차이

파이썬에서 .sort() 메서드와 built-in 함수 sorted( ) 의 차이를 알아봅니다. .sort() list.sort([reverse= ][, key= ]) - 원본 리스트를 정렬하되 반환 값은 None 입니다. - 원본 리스트의 순서를 변경합니다...

inma.tistory.com

 

https://hsd0937.tistory.com/20

 

[Python] Dictionary 예제 - Keys(), Values(), items()

Dictionary 예제 입니다. Key와 Value로 이루어져 있습니다. 해당 value의 key값을 입력하여 Dictionary에 추가하며 key값을 가지고 value 값을 출력할 수 있습니다. # Dictionary 선언 및 구성 변수명 = { } 로..

hsd0937.tistory.com

 

https://ooyoung.tistory.com/99

 

파이썬 math 모듈 ceil( ), floor( ) 함수 / 실수를 올림, 내림하여 정수를 반환하는 함수

[Python] math.ceil( ) / math.floor( ) 수학의 올림/ 내림 기능을 하는 함수이다. math 모듈을 import 하고서 함수를 사용하면 실수를 올림/내림하여 정수를 반환한다. 사용방법은 두 함수 모두 동일하고 별다

ooyoung.tistory.com

 

 

Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다!