[1차] 추석 트래픽
https://programmers.co.kr/learn/courses/30/lessons/17676
코딩테스트 연습 - [1차] 추석 트래픽
입력: [ "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-1
programmers.co.kr
어이없게 자기 자신을 세는데서 헷갈리는 바람에 시간을 많이 썼다.
요행을 부릴 생각 하지 말고, 코드가 좀 길어지더라도 의도대로 명확하게 코드를 짜는게 좋을 것 같다.
round는 디버깅할 때 보니까 부동소수점 문제가 좀 나타나길래 디버깅할때 보기 쉽게하려고 넣었다.
import math
def get_elapsed_time(base, time, duration):
hour, minute, sec = time.split(':')
hour_diff = int(hour) - base[0]
minute_diff = int(minute) - base[1]
sec_diff = float(sec) - base[2]
end = (hour_diff * 60 * 60) + (minute_diff * 60) + sec_diff
start = end - duration + 0.001
return (start, end)
def solution(lines):
answer = 1
timeset = []
base = (lines[0].split()[1].split(':'))
base[0] = int(base[0])
base[1] = int(base[1])
base[2] = float(base[2])
for line in lines:
time, duration = line.split()[1:]
duration = float(duration[:-1])
start, end = get_elapsed_time(base, time, duration)
timeset.append((round(start,3), round(end,3)))
for i in range(len(timeset)):
print(timeset[i])
cnt = 1
for j in range(len(timeset)):
if i == j:
continue
# i의 시작지점으로부터 1초간 몇개의 request가 있었는가
if timeset[j][0] - timeset[i][0] < 1 and timeset[j][0] - timeset[i][0] > 0:
cnt += 1
elif timeset[j][1] - timeset[i][0] < 1 and timeset[j][1] - timeset[i][0] > 0:
cnt += 1
elif timeset[i][0] >= timeset[j][0] and timeset[i][0] + 1 <= timeset[j][1]:
cnt += 1
if answer < cnt:
answer = cnt
cnt = 1
for j in range(len(timeset)):
if i == j:
continue
# i의 끝지점으로부터 1초간 몇개의 request가 있었는가
if timeset[j][0] - timeset[i][1] < 1 and timeset[j][0] - timeset[i][1] > 0:
cnt += 1
elif timeset[j][1] - timeset[i][1] < 1 and timeset[j][1] - timeset[i][1] > 0:
cnt += 1
elif timeset[i][1] >= timeset[j][0] and timeset[i][1] + 1 <= timeset[j][1]:
cnt += 1
if answer < cnt:
answer = cnt
return answer
시간을 : 를 기준으로 split 한다.
이후 baseline을 기준으로(첫 번째 로그의 끝시간) 몇 초가 지났는지를 초단위로 변환한다.
(사실 이때 baseline을 쓸 필요가 없었을 것 같다. 그냥 9월 15일 0시0분0초를 기준으로 초단위로 변환하는 셈 치는게 오히려 보기에도 좋았을 듯...)
이후에는 각 log의 시작지점 및 끝지점을 기준으로 1초간 몇개의 request가 존재하였는지 각각 count한다.
가장 많은 request가 있었던 구간의 request 개수를 반환한다.
def get_elapsed_time(time, duration):
hour, minute, sec = time.split(':')
hour_diff = int(hour) * 1000
minute_diff = int(minute) * 1000
sec_diff = int(float(sec) * 1000)
end = (hour_diff * 60 * 60) + (minute_diff * 60) + sec_diff
start = end - duration + 1
return (start, end)
def solution(lines):
answer = 1
timeset = []
for line in lines:
time, duration = line.split()[1:]
duration = int(float(duration[:-1]) * 1000)
start, end = get_elapsed_time(time, duration)
timeset.append((start, end))
for i in range(len(timeset)):
cnt = 1
for j in range(i + 1, len(timeset)):
# i의 끝지점으로부터 1초간 몇개의 request가 있었는가
if timeset[j][0] - 1000 < timeset[i][1]:
cnt += 1
if answer < cnt:
answer = cnt
return answer
윤창이랑 이야기한 결과, 끝점을 기준으로 정렬되어 앞부분을 기준으로 count 할 필요가 없었다.
1. 초를 밀리초 단위로 변경하였다.(부동소수점, round 문제를 없애기 위해)
2. 끝지점에서 앞의 1초 사이에 몇 개의 request가 존재하는지 i request 이후 request에서 count하였다.