로그(또는 레코드) 기록을 중심으로 정렬 또는 카운트하는 문제가 자주 나오는 것 같다. 이번 문제 역시 밀리초 단위로 구간을 확인하는 문제였는데, input date로 받은 문자열을 정수 단위로 변환한 뒤 구간을 확인하는 게 첫 번째 관건, "어떻게 1초 단위 구간을 헤아리는지" 체크하는 게 두 번째 관건이었다.
2016-09-15 21:00:02.066 2.62s
와 같은 문자열이고 중간의 time stamp를 가장 낮은 단위의 밀리초 단위로 환산, end time을 구한다. 이후 처리시간 T를 빼고 1밀리초를 더해 start time을 구한다.start time, end time이 함께 기록된 리스트를 통해 위와 같은 구간을 얻어낼 수 있다. 이제 "어떤 기준으로 1초 구간을 정하는지" 결정한다.
단위 초(0.00초와 같은) 단위로 헤아리는 게 아니라 겹쳐진 시간 어떤 때라도 시작점이 될 수 있다. 위 구간의 모든 지점(즉 start time, end time)을 어느 time point로 잡고 그 시점의 time point ~ time point + 1000을 구간으로 정한다.
위 구간을 이루는 막대의 시작점 start와 마지막 지점 end를 각각 time point ~ time point + 1000과 비교하자. 즉 time point < end, time point + 1000 > start를 모두 만족하면 내가 정한 이 빨간 구간이 막대 사이에 있는 셈이다. 이때 time point == end도 끝 시간 포함이므로 추가해야 한다.
def solution(lines):
record = []
for line in lines:
date, S, T = line.split()
h, m, s = S.split(':')
end = (int(h)*3600 + int(m)*60 + float(s))*1000
T = float(T[:-1])*1000
end = int(end)
start = end - int(T) + 1
record.append([start, end])
# 각 log의 start/end 시간을 ms 단위로 리스트
def get_cnt(point):
cnt = 0
for start, end in record:
if point <= end and point + 1000 > start: cnt += 1
# 1초 구간(point~point+1000)과 로그의 시간 구역이 겹치는 부분이 있을 때 카운트
return cnt
max_cnt = 0
for start, end in record:
max_cnt = max(max_cnt, get_cnt(start), get_cnt(end))
# 각 log 시간대의 start/end 지점을 기준 모든 리스트의 시간대 1초(1000밀리초) 카운트
return max_cnt