https://school.programmers.co.kr/learn/courses/30/lessons/92341
문제해석
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)
'알고리즘' 카테고리의 다른 글
파괴되지 않은 건물 - pYthon (0) | 2023.06.19 |
---|---|
양궁대회- 22KAKAO Blind(python) (0) | 2023.06.16 |
등산코스정하기-python(kakao22 season) (0) | 2023.06.12 |
두 큐 합 같게 만들기 - Python으로 풀이 (0) | 2023.06.11 |
성격유형검사하기-2022kakao 코테 (2) | 2023.06.10 |