프로그래머스 | 2022 KAKAO BLIND RECRUITMENT | 주차 요금 계산 [파이썬 python]

2023. 6. 27. 21:55·Algorithm/프로그래머스
 

프로그래머스

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

programmers.co.kr

 

코드

from datetime import datetime
import math

def solution(fees, records):
    answer = {record.split()[1]:0 for record in records} # 차량번호:누적시간
    car = {} # 차량번호:입차시간
    for record in records:
        time, car_num, inout = record.split()

        if inout == 'IN': # IN이면 딕셔너리 car에 입차시간 기록
            car[car_num] = datetime.strptime(time,"%H:%M")
        else: # OUT이면 주차시간(출차-입차)을 분단위로 변환하여 딕셔너리 answer에 누적
            pay = str(datetime.strptime(time,"%H:%M") - car[car_num])
            pay = int(pay.split(':')[0]) * 60 + int(pay.split(':')[1])
            answer[car_num] += pay
            del car[car_num] # 출차를 했으면 입차기록 제거

    if len(car) > 0 : # car에 남아있는 요소가 있으면(입차만하고 출차 안함)
        for i in car: # 23:59에 출차한 것으로 가정하고 주차시간 계산하여 answer에 누적
            pay = str(datetime.strptime('23:59',"%H:%M") - car[i])
            pay = int(pay.split(':')[0]) * 60 + int(pay.split(':')[1])
            answer[i] += pay

    answer = sorted(answer.items()) # key 기준으로 오름차순 정렬
    for i in range(len(answer)): # 주차요금 계산
        if answer[i][1] <= fees[0]: # 기본 시간 이하이면 기본 요금
            answer[i] = fees[1]
        else: # 기본 시간 초과이면 기본 요금 + 초과 시간에 대한 요금
            answer[i] = fees[1] + math.ceil((answer[i][1] - fees[0])/fees[2]) * fees[3]

    return answer

딕셔너리를 사용하면 쉽게 풀 수 있는 문제이다.

먼저 records에 있는 입/출차 내역을 가지고 해당 기록이 입차인지 출차인지 구분한다.

for record in records:
    time, car_num, inout = record.split()

    if inout == 'IN': # IN이면 딕셔너리 car에 입차시간 기록
        car[car_num] = datetime.strptime(time,"%H:%M")
    else: # OUT이면 주차시간(출차-입차)을 분단위로 변환하여 딕셔너리 answer에 누적
        pay = str(datetime.strptime(time,"%H:%M") - car[car_num])
        pay = int(pay.split(':')[0]) * 60 + int(pay.split(':')[1])
        answer[car_num] += pay
        del car[car_num] # 출차를 했으면 입차기록 제거

입차기록이면 딕셔너리 car에 입차시간을 기록한다.

출차기록이면 car에서 해당 차량번호의 입차기록을 찾아 주차시간(출차-입차)을 계산한다.

주차 요금은 분단위로 부과되므로 주차시간을 분단위로 변환하여 딕셔너리 answer에 누적한다.

해당 차량이 출차가 되었으면 딕셔너리 car에서 해당 차량의 입차 기록을 지운다.

이때 시간 기록은 파이썬 라이브러리 중 datetime을 이용하였다.

 

문제에서 어떤 차량이 입차된 후에 출차된 내역이 없다면, 23:59에 출차된 것으로 간주한다고 했으므로, 출차내역이 없는지 확인한다.

 if len(car) > 0 : # car에 남아있는 요소가 있으면(입차만하고 출차 안함)
    for i in car: # 23:59에 출차한 것으로 가정하고 주차시간 계산하여 answer에 누적
        pay = str(datetime.strptime('23:59',"%H:%M") - car[i])
        pay = int(pay.split(':')[0]) * 60 + int(pay.split(':')[1])
        answer[i] += pay

출차기록이 있으면 car에서 입차기록은 지우므로, 출차기록이 없는 차량은 car에 입차기록이 남아있다.

그러므로 car에 요소가 남아있는지 len() 함수를 사용하여 확인한다.

만약 len(car) > 0이면, 딕셔너리 car에 남아있는 차량의 입차기록을 가져와 23:59분에 출차한 것으로 간주하여 주차 시간을 분단위로 계산해 준다.

 

모든 누적 주차 시간이 계산되었으면, 차량별 주차 요금을 계산한다.

answer = sorted(answer.items()) # key 기준으로 오름차순 정렬
for i in range(len(answer)): # 주차요금 계산
    if answer[i][1] <= fees[0]: # 기본 시간 이하이면 기본 요금
        answer[i] = fees[1]
    else: # 기본 시간 초과이면 기본 요금 + 초과 시간에 대한 요금
        answer[i] = fees[1] + math.ceil((answer[i][1] - fees[0])/fees[2]) * fees[3]

문제에서 차량번호 오름차순으로 주차 요금을 출력하라고 했다.

answer는 차량번호:누적시간 형태의 딕셔너리 이므로 key(차량번호)를 기준으로 오름차순 정렬해 준다.

그다음 answer에서 순차적으로 가져와 주차 요금을 계산한다.

반응형
저작자표시 (새창열림)
'Algorithm/프로그래머스' 카테고리의 다른 글
  • 프로그래머스 | 게임 맵 최단거리 [파이썬 python]
  • 프로그래머스 | 기능개발 [파이썬 python]
  • 프로그래머스 | 2019 KAKAO BLIND RECRUITMENT | 오픈채팅방 [파이썬 python]
  • 프로그래머스 | 2018 KAKAO BLIND RECRUITMENT | [1차] 뉴스 클러스터링 [파이썬 python]
dduniverse
dduniverse
  • dduniverse
    dduniverse
    dduniverse
  • 전체
    오늘
    어제
    • 분류 전체보기 (242)
      • Algorithm (123)
        • 알고리즘 이론 (8)
        • 백준 (19)
        • 프로그래머스 (83)
        • 구름 알고리즘 먼데이 챌린지 (13)
      • 빅데이터분석기사 (10)
        • 통계 (4)
        • 실기 (6)
      • KT에이블스쿨 (26)
      • FrontEnd (11)
        • React (5)
        • 기타 (6)
      • BackEnd (18)
        • Django (15)
        • Spring (3)
      • DS & ML (11)
        • Machine Learning (9)
        • Kaggle (2)
      • TIL (43)
        • python (22)
        • javascript (3)
        • 오류해결 (10)
        • 기타 (7)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
    • 관리
    • 글쓰기
  • 링크

  • 인기 글

  • hELLO· Designed By정상우.v4.10.0
dduniverse
프로그래머스 | 2022 KAKAO BLIND RECRUITMENT | 주차 요금 계산 [파이썬 python]
상단으로

티스토리툴바