[Python] 카카오(3) 추석트래픽

Updated: Categories:

https://programmers.co.kr/learn/courses/30/lessons/17676

아이디어

  1. 주어진 로그 문자열 리스트를 시간 데이터로 모두 파싱해야합니다.
  2. 따라서 strptime 함수를 사용해 로그가 끝난 시간(end)을 시간 데이터로 파싱합니다.
  3. 그리고 처리시간을 끝난 시간에서 빼주면 시작 시간(start)이 나옵니다.
  4. 이 두 시간을 새로운 리스트에 저장합니다.
  5. 이제 파싱된 리스트를 순회하여 1초 간격별로 처리된 로그의 수를 세야합니다.
  6. 처음 시간부터 끝 시간까지 0.001초 단위로 검사하는게 맞지만 이는 효율적이지 않습니다.
  7. 따라서 로그가 겹칠만한 시간만 검사합니다.
  8. 로그들의 시작시간과 끝시간을 활용해 그 간격 + 1초의 간격을 1초 단위로 검사합니다.
  9. 로그 타임아웃은 3초이므로 이를 활용해 구간을 1초 간격으로 나눕니다.
  10. 만약 구간의 시작이 해당 로그의 끝 시간을 넘어가면 이는 필요없는 검사이므로 구간 시작을 로그 끝 시간으로 바꿉니다.
  11. 이렇게 설정된 구간들 안에 들어오는 로그들의 수를 세어 리스트에 저장합니다.
  12. 해당 리스트의 max 값이 정답이므로 반환합니다.
  13. 문자열을 시간으로 파싱하는 방법과 구간 검사 방법이 매우 중요한 문제였습니다.

알게 된 함수/방법

  • 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)