https://school.programmers.co.kr/learn/courses/30/lessons/17676
input :
2016-09-15 03:10:33.020 0.011s
은 "2016년 9월 15일 오전 3시 10분 33.010초"부터 "2016년 9월 15일 오전 3시 10분 33.020초"까지 "0.011초" 동안 처리된 요청을 의미한다. (처리시간은 시작시간과 끝시간을 포함)오름차순 정렬
되어 있다.output :
조건 :
예시 2개에서 모든 경우를 보여준다.
예시 2번에서 끝나는 시점과 두 번째 로그가 시작하는 구간에서 초당 최대 처리량이 2개가 되는 것을 볼 수 있고.
예시 3번에서 매우 많은 양의 로그를 통해서 결과를 낼 때를 보여준다.
로그는 2000개 밖에 주지 않지만 시간으로 따졌을 떄 만들어야 하는 구간이 25만개라고 생각했다.
그리고 시작과 끝 점만 따지면 결과가 나올까 생각했다.
예제 2번에서 볼 수 있듯이 초를 기준으로 나누면 안 된다.
초로 나눈다면 3D 프린팅 처럼 해당 위치를 확인하면서 돌 수 있듯이 해야하는데 이는 불가능해 보인다.
해설에서의 힌트처럼 언제 처리량이 바뀌는지를 확인한다면 쉽게 볼 수 있었다.
맨 처음 완료된 로그의 경우부터 따진다면 시작 지점보다 끝 지점에서 겹치는 지를 통해 해당 지점에 몇 번의 처리가 필요한 지를 볼 수 있다.
start - 999를 통해 이미 start가 고정된 end보다 작은지는 미리 판단 되기 때문에 이것도 포함 된다.
입력 받은 T시간은 모두 0으로 채워져 있지 않다.
그래서 float으로 입력을 받아 1천을 곱하거나 아니면 0을 채워줘야 한다.
def solution(lines):
answer = 0
starts, ends = [], []
for idx, data in enumerate(lines):
data = data.split(" ")
start, end = milli(data[1], data[2][:-1])
starts.append(start)
ends.append(end)
for i in range(len(lines)):
temp = 1
now_end = ends[i]
for j in range(i + 1, len(lines)):
if starts[j] - 1000 + 1 <= now_end:
temp += 1
answer = max(answer, temp)
return answer
def milli(time, excute):
hr, minute, second = time.split(":")
hr = int(hr) * 3600
minute = int(minute) * 60
second, millisecond = map(int, second.split("."))
end = (hr + minute + second) * 1000 + millisecond
if "." in excute:
e_sec, e_mil = excute.split(".")
excute = e_sec + e_mil
while len(excute) != 4:
excute += "0"
return end - int(excute) + 1, end