[Python] 카카오(3) 추석트래픽
Updated: Categories: Programmershttps://programmers.co.kr/learn/courses/30/lessons/17676
아이디어
- 주어진 로그 문자열 리스트를 시간 데이터로 모두 파싱해야합니다.
- 따라서 strptime 함수를 사용해 로그가 끝난 시간(end)을 시간 데이터로 파싱합니다.
- 그리고 처리시간을 끝난 시간에서 빼주면 시작 시간(start)이 나옵니다.
- 이 두 시간을 새로운 리스트에 저장합니다.
- 이제 파싱된 리스트를 순회하여 1초 간격별로 처리된 로그의 수를 세야합니다.
- 처음 시간부터 끝 시간까지 0.001초 단위로 검사하는게 맞지만 이는 효율적이지 않습니다.
- 따라서 로그가 겹칠만한 시간만 검사합니다.
- 로그들의 시작시간과 끝시간을 활용해 그 간격 + 1초의 간격을 1초 단위로 검사합니다.
- 로그 타임아웃은 3초이므로 이를 활용해 구간을 1초 간격으로 나눕니다.
- 만약 구간의 시작이 해당 로그의 끝 시간을 넘어가면 이는 필요없는 검사이므로 구간 시작을 로그 끝 시간으로 바꿉니다.
- 이렇게 설정된 구간들 안에 들어오는 로그들의 수를 세어 리스트에 저장합니다.
- 해당 리스트의 max 값이 정답이므로 반환합니다.
- 문자열을 시간으로 파싱하는 방법과 구간 검사 방법이 매우 중요한 문제였습니다.
알게 된 함수/방법
datetime.strptime('문자열', '형식')
: 문자열을 시간 데이터로 파싱datetime.timedelta('시간단위' = '추가할 시간')
: 숫자 자료형을 원하는 시간단위로 시간 데이터로 파싱
정답 코드
from datetime import datetime, timedelta
def solution(lines):
log_list = []
for l in lines:
a, b, c = l.split(' ')
end = datetime.strptime(a+' '+b, '%Y-%m-%d %H:%M:%S.%f')
sec = float(c.replace('s', ''))
start = end - timedelta(seconds = sec - 0.001)
log_list.append([start, end])
cnt_list = []
for start, end in log_list:
for t in range(4):
section_start = start + timedelta(seconds = t)
section_end = section_start + timedelta(seconds = 0.999)
if section_start > end:
section_start = end
section_end = end + timedelta(seconds = 0.999)
cnt = 0
for log_start, log_end in log_list:
if not (log_end < section_start or section_end < log_start):
cnt += 1
cnt_list.append(cnt)
return max(cnt_list)