이번 추석에도 시스템 장애가 없는 명절을 보내고 싶은 어피치는 서버를 증설해야 할지 고민이다. 장애 대비용 서버 증설 여부를 결정하기 위해 작년 추석 기간인 9월 15일 로그 데이터를 분석한 후 초당 최대 처리량을 계산해보기로 했다. 초당 최대 처리량은 요청의 응답 완료 여부에 관계없이 임의 시간부터 1초(=1,000밀리초)간 처리하는 요청의 최대 개수를 의미한다.
입력 | 출력 |
---|---|
["2016-09-15 01:00:04.001 2.0s","2016-09-15 01:00:07.000 2s"] | 1 |
["2016-09-15 01:00:04.002 2.0s","2016-09-15 01:00:07.000 2s"] | 2 |
["2016-09-15 20:59:57.421 0.351s","2016-09-15 20:59:58.233 1.181s","2016-09-15 20:59:58.299 0.8s","2016-09-15 20:59:58.688 1.041s","2016-09-15 20:59:59.591 1.412s","2016-09-15 21:00:00.464 1.466s","2016-09-15 21:00:00.741 1.581s","2016-09-15 21:00:00.748 2.31s","2016-09-15 21:00:00.966 0.381s","2016-09-15 21:00:02.066 2.62s"] | 7 |
# 코드
def solution(lines):
answer = 0
# 날짜는 모두 같으므로 삭제
lines = [each.split(' ')[1:] for each in lines]
# (시작 시간, 종료 시간) 형태로 변경
timeTable = []
for end, t in lines:
# 시간은 초로 변환한 값에 1000을 곱해준다.
# float형으로 소수점 3자리까지 사용하는 경우 값이 이상하게 들어가는 경우가 생겨서
# 1000을 곱해 int형으로 사용한다.
end = list(map(float, end.split(':')))
end = int((end[0] * 3600 + end[1] * 60 + end[2]) * 1000)
start = end - int(float(t[:-1])* 1000) + 1
timeTable.append((start, end))
print(timeTable)
len_timeTable = len(timeTable)
# 각 로그의 종료 시간을 기준으로 가능한 모든 경우 탐색
# 각 경우 중 최대값을 답으로 반환
for idx, (start, end) in enumerate(timeTable):
cnt = 1
end_p1 = end + 999
for j in range(idx+1, len_timeTable+1):
if j == len_timeTable:
break
# 다음 시간대의 로그 시작 시간이 현재 종료 시간 이하이거나 1초 미만의 차이인경우
# 최대 처리량 + 1
if end >= timeTable[j][0] or end_p1 >= timeTable[j][0]:
cnt += 1
answer = cnt if cnt > answer else answer
return answer