본문 바로가기

Algorithm/카카오

[2022 KAKAO BLIND RECRUITMENT] 주차 요금 계산

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

 

프로그래머스

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

programmers.co.kr

 

 

1. 해결방법

단순? 아니 그냥 시뮬레이션 문제이다.
본인은 stack과 딕셔너리를 활용해서 해결했다. 디버깅때매 1시간 10분 소요;;

1. 일단 차량 번호에 해당하는 입차, 출차를 딕셔너리에 추가
2. 차량들을 For문 돌려서 각 차량이 주차장에 있었던 시간(분)을 total_time에 저장
3. 주차장에 있었던 시간이 기본 시간보다 적은 경우는 기본 요금, 아니면 기본요금 + 특정 분당 추가요금으로 계산
4. 주의해야될 점은 시간 계산할 때 분을 나누고 소수점 자리 올림으로 해결해야 한다. (글을 다 안읽어서 이걸로 20분 잡아 먹은듯)
5. 한 가지 더 주의할 점은 차량 번호는 오름차순으로 정렬해야 된다는 점이기에 딕셔너리 key 값을 오름차순으로 정렬한다.

 

 

2. 정답코드

import math

def solution(fees, records):
    answer = []

    history = {}
    for record in records:
        time, number, status = record.split()
        if number not in history:
            history[number] = [[time, status]]
        else:
            history[number].append([time, status])
        
    history = dict(sorted(history.items(), key=lambda x:x[0]))
    
    for h in history:
        stack = []
        total_time = 0
        for num in history[h]:
            if num[1] == 'IN':
                stack.append(num[0])
            else:
                enter_list = list(stack.pop().split(':'))
                out_list = list(num[0].split(':'))
                for i in range(2):
                    if i == 0:
                        total_time += (int(out_list[i]) - int(enter_list[i])) * 60
                    else:
                        total_time += (int(out_list[i]) - int(enter_list[i]))
        if stack:
            temp = list(stack.pop().split(':'))
            total_time += ((23 - int(temp[0])) * 60) + (59 - int(temp[1]))
        
        cost = 0
        if total_time <= fees[0]:
            cost = fees[1]
        
        elif total_time > fees[0]:
            cost = math.ceil((total_time - fees[0]) / fees[2]) * fees[3] + fees[1]
        answer.append(cost)
                
            
    return answer