본문 바로가기
파이썬 코딩테스트/프로그래머스

프로그래머스 / 주차 요금 계산 / 파이썬

by S.T.Lee 2022. 2. 18.

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

from math import ceil

def time_calculator(records):
    record_dic = {} #기록을 딕셔너리 형태로 저장합니다.
    for record in records:
        rec = record.split(" ")#각 기록을 띄어쓰기를 기준으로 나누고
        time = rec[0].split(":")#시간을 :기준으로 나누어 
        total_time = int(time[0])*60 + int(time[1])#분으로 바꿔줍니다
        if rec[1] not in record_dic:#딕셔너리에 없다면 처음에는 음수값으로 넣어줍니다
            if rec[2] == "IN":
                record_dic[rec[1]] = -total_time
        else:
            if rec[2] == "IN":#입장했을시
                record_dic[rec[1]] = record_dic[rec[1]] - total_time#초출이 아니면 빼주고
            else:
                record_dic[rec[1]] = record_dic[rec[1]] + total_time#아니라면 더해줍니다
    
    for rd in record_dic:#위의 과정은 마지막이 out이였는지 판별하기 위함인데 음수이면 아니고 양수이면 맞습니다
        if record_dic[rd] <= 0:#즉 음수일때는 아니라고 가정하고 23:59분에 나간거 처리합니다.
            record_dic[rd] = record_dic[rd] + (60*23 + 59)
    return record_dic

def solution(fees, records):
    answer = []
    time = time_calculator(records) #기록을 수정합니다.
    
    time_list = []
    for t in time:
        time_list.append([t, time[t]])
    time_list.sort(key=lambda x:x[0])#출력조건에 따라 번호판이 작은 차부터 계산해주기 용이하게 바꿉니다

    for tl in time_list:
        if tl[1] <= fees[0]: #기본요금보다 작을때
            answer.append(fees[1])
        else: #기본요금보다 더 나왔을때 입니다.
            answer.append(fees[1] + (ceil((tl[1]-fees[0])/fees[2]))*fees[3] )
    return answer