알고리즘/프로그래머스

[프로그래머스 | Lv2] 주차 요금 계산 (Python) - 2022 KAKAO BLIND RECRUITMENT

sssbin 2023. 2. 28. 20:12

 

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

 

프로그래머스

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

programmers.co.kr

 

알고리즘 자체를 생각하는건 쉬웠으나.. 문자열 처리가 까다로운 문제였다.

 

먼저 딕셔너리에 {차량 번호: 시간(시:분 리스트)}으로 저장하고,

반복문을 통해 딕셔너리를 순회하면서 누적 주차 시간을 계산해줬다.

 

time 변수는 각 입차/출차에 대한 시간이고, total 변수는 누적 주차 시간이다.

time에 딕셔너리에 저장되어 있는 시간을 두개씩 짝지어서 시간을 계산해주고, 이를 total에 더했다.

짝지어진 시간이 없으면 마지막 시간에서 23:59까지 계산하여 total에 더했다.

모든 시간 계산이 끝나면 주차 요금을 계산하여 딕셔너리의 value 값을 바꿔준다.

 

마지막으로 딕셔너리를 key값으로 정렬해주고, value값만 모아서 출력해주면 된다.

 

# 프로그래머스 92341: 주차 요금 계산 (2022 KAKAO BLIND RECRUITMENT)

import math

def solution(fees, records):
    car = []
    dic = {}
    for i in records: # 딕셔너리에 저장 {차량 번호: 시간}
        j = i.split()
        if j[1] in dic:
            dic[j[1]].append(j[0])
        else:
            car.append(j[1])
            dic[j[1]] = [j[0]]
        
    for i in car:
        time = -1
        total = 0
        for j in dic[i]: # 각 딕셔너리를 순회하면서 누적 주차 시간 계산
            h = int(j.split(':')[0])
            m = int(j.split(':')[1])
            
            if time == -1:
                time = h * 60 + m
            else:
                time = h * 60 + m - time
                total += time
                time = -1
        if time != -1:
            total += (23*60+59) - time
        
        # 주차 요금 계산
        if total > fees[0]:
            dic[i] = fees[1] + math.ceil((total-fees[0]) / fees[2]) * fees[3]
        else:
            dic[i] = fees[1]
        
    dic = sorted(dic.items()) # key값으로 정렬
    
    answer = []
    for i, j in dic:
        answer.append(j)
    
    return answer