알고리즘

주차요금계산 - 22kakao blind recruitment - python

2료일 2023. 6. 16. 03:17

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

 

프로그래머스

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

programmers.co.kr

문제해석

fees에 순서대로기본시간, 기본요금, 추가시간당, 추가요금으로 나오고 records에는 몇시에 어떤차가 들어오거나 나갔는지의 기록이 있다.

먼저 레코드들의 정보를 쪼개서 cardict에 key값으로는 차번호가 value에는 시간과 in,out상태를 넣어주었다.

첫번째 for문을 다 돌게 되면 키값에 해당하는 모든 history가 value로 이차배열이 들어가게 된다.

그 후 문제에서 보면 차가 들어오는거만 있고 나가는게 없다면 그건 23:59분을 기준으로 out을 해준다고 했다. 그래서 해당 차번호에 해당하는 value이차 배열의 마지막것이 in으로 끝난다면 23:59,out을 추가해주었다. 

그 후 값 키에 해당하는 value를 for문으로 돌면서 시간 뒤에 in으로 끝나면 temp에 더해주고

out이면 전체 분에서 이전에 나온 in시간 분을 빼주면 그 사이의 시간을 구해줄 수 있기에 그것들을 result라는 배열에 넣어주었다.

해당하는 키가 모든 value를 다 돌면 result배열의 원소들의 합을 구해주고 만약 기본시간보다 많다면 초과시간당 가격을 매겨 price에 더해준다. 총 price를 해당하는 차번호와 함께 answer배열에 넣어주고 그 차번호를 기준으로 정렬을 한후 거기서 가격만 뽑아야하기에 realanswer이라는 배열을 하나 더만들어서 뽑아주었다.

 

from math import ceil
def hourtomintues(hour):
    h,m = map(int, hour.split(":"))
    return h*60 + m
def solution(fees, records):
    answer = []
    cardict = {}
    for i in records:
        time, carnum, carstate = i.split()
        if carnum in cardict:
            cardict[carnum].append([time, carstate])
        else:
            cardict[carnum] = [[time,carstate]]
    for j in cardict:
        if cardict[j][-1][-1] == "IN":
            cardict[j].append(["23:59","OUT"])
        temp = 0
        price = fees[1]
        result = []
        for k in cardict[j]:
            if k[-1] == "IN":
                temp += hourtomintues(k[0])
            else:
                temp = hourtomintues(k[0]) - temp
                result.append(temp)
                temp = 0
        a = sum(result)
        if  a > fees[0]:
            price += ceil((a-fees[0]) / fees[2]) * fees[3]
        answer.append([j,price])
        answer.sort(key=lambda x:x[0])
        realanswer = []
        for i in answer:
            realanswer.append(i[1])
    return realanswer

시간복잡도는 O(n^2)