본문 바로가기

알고리즘/카카오 EASY

주차 요금 계산 (Level 2)

문제

 

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

 

프로그래머스

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

programmers.co.kr

 

내 풀이

 

구현에 사용될 fees와 records의 원소들을 정리해주었다.

특히 records의 원소들은 리스트로 초기화한 defaultdict로 만든 dic에 넣어주었다. '차 번호'를 key로 하고, '시각'을 value로 하였다.

 

그 후 dic를 돌면서 한 차씩 몇 분 동안 주차되어있었는지 계산한다.

'23:59'에 출차한 차는 lst의 길이가 홀 수인 경우로 판별하였고, 이러한 차는 출차 내역이 없기 때문에 출차 내역을 따로 추가해주었다.

 

lst는 차 한대의 입/출차 기록을 담은 리스트이다.

lst의 원소를 queue처럼 앞에서부터 하나씩 꺼내어 몇 분 동안 머물러있었는지 계산하였다.

 

차가 머물러 있던 시간(분)을 계산하였으면 문제에 나와있는 공식을 보며 주차 요금이 얼마인지 계산하였다.

 

차량 번호가 작은 자동차의 요금부터 출력하면 정답이 된다.

 

from collections import defaultdict
import math

def solution(fees, records):
    answer = []
    base_min, base_fee, unit_min, unit_fee = fees
    dic = defaultdict(list)
    for record in records:
        record = list(record.split())
        dic[record[1]].append(record[0])
    
    temp = []
    for key in dic:
        lst = dic[key]
        
        if len(lst) % 2 != 0: 
            lst.append('23:59')
        m = 0
        while lst:
            x, y = lst.pop(0), lst.pop(0)
            x, y = x.split(':'), y.split(':')
            m += (int(y[0]) - int(x[0])) * 60 + (int(y[1]) - int(x[1]))
        
        if m <= base_min:
            fee = base_fee
            temp.append((int(key), fee))
        else:
            fee = base_fee + math.ceil((m - base_min) / unit_min) * unit_fee
            temp.append((int(key), fee))
    temp.sort(key = lambda x: x[0])
    
    return [x[1] for x in temp]

 

총평

차근차근, 하나씩 하나씩 구현하면 된는 문제였다.

 

'알고리즘 > 카카오 EASY' 카테고리의 다른 글

양궁대회 (Level 2)  (0) 2022.08.04
k진수에서 소수 개수 구하기 (Level 2)  (0) 2022.07.26
n진수 게임 (Level 2)  (0) 2022.07.26
파일명 정렬 (Level 2)  (0) 2022.07.25
방금그곡 (Level 2)  (0) 2022.07.25