https://school.programmers.co.kr/learn/courses/30/lessons/92341
import datetime
import math
def solution(fees, records):
answer = []
dic={}
dic2={}
arr = []
for i in range(len(records)):
a = list(records[i].split())
if a[1] not in dic:
dic[a[1]] = [a[0],a[2]]
else:
if a[2] == 'OUT':
hm = dic[a[1]][0].split(':')
hm2 = a[0].split(':')
date1 = datetime.timedelta(hours= int(hm[0]) , minutes=int(hm[1]))
date2 = datetime.timedelta(hours= int(hm2[0]) , minutes=int(hm2[1]))
minus = date2 - date1
arr.append([a[1],minus])
dic[a[1]] = [a[0],a[2]]
else:
dic[a[1]] = [a[0],a[2]]
for key,value in dic.items():
if value[1] == 'IN':
h = value[0].split(":")
date2 = datetime.timedelta(hours= 23 , minutes=59)
date1 = datetime.timedelta(hours= int(h[0]) , minutes=int(h[1]))
minus = date2 - date1
arr.append([key,minus])
for i in range(len(arr)):
if arr[i][0] not in dic2:
dic2[arr[i][0]] = arr[i][1]
else:
dic2[arr[i][0]] = dic2[arr[i][0]] + arr[i][1]
new_dic = dict(sorted(dic2.items()))
for key,value in new_dic.items():
h = str(value).split(':')
tim = (int(h[0]) * 60) + int(h[1])
mt = tim - fees[0]
print(mt)
if mt <= 0:
answer.append(fees[1])
else:
q = math.ceil(mt / fees[2]) * fees[3]
q += fees[1]
answer.append(q)
return answer
문제 이해도 쉬웠고 복잡한 계산도 없었기에 해당 문제는 모듈만 잘 활용하면 쉽게 풀릴 수 있는 문제같았다.
그러나 내가 제출한 코드는 for문을 여러번 사용했었다.
시간초과나 그런건 일어나지 않았지만
records를 딕셔너리에 저장하는 for문 하나.
dic에 저장된 것들 중 OUT이 아닌 IN이 되어있는 것을 체크하는 for문 하나.
그리고 정렬까지..
그리고 총 시간 계산 까지 총 세개의 for문이 사용되었다.
남들이 제출한 코드가 궁금해서 한 번 검색해보았더니
def solution(fees, records):
answer = []
# 기본 시간, 기본 요금, 단위 시간, 단위 요금 순
dt, df, ut, uf = fees
dic = dict()
for r in records:
time, number, history = r.split()
number = int(number)
if number in dic:
dic[number].append([dateToMinutes(time), history])
else:
dic[number] = [[dateToMinutes(time), history]]
rList = list(dic.items())
rList.sort(key=lambda x : x[0])
for r in rList:
t = 0
for rr in r[1]:
if rr[1] == "IN":
t -= rr[0]
else:
t += rr[0]
if r[1][-1][1] == "IN":
t += dateToMinutes('23:59')
if t <= dt:
answer.append(df)
else:
answer.append(df + math.ceil((t-dt) / ut) * uf)
return answer
별 다를 것은 없었지만 확실히 내 코드보다 간결하고 실행시간이 짧아보이긴 한다.
'알고리즘' 카테고리의 다른 글
프로그래머스) 할인행사-python (0) | 2023.01.26 |
---|---|
프로그래머스) 스킬트리-python (0) | 2023.01.24 |
프로그래머스) 압축-python (0) | 2023.01.24 |
프로그래머스 (0) | 2023.01.23 |
프로그래머스) k진수에서 소수찾기-python (0) | 2023.01.20 |