3Level [1차] 추석트래픽


< 문제 이해 >

  1. lines배열
    • S 기준 오름차순으로 정렬
    • 로그문자열로 이루어짐
    • 로그 문자열 = 응답완료시간 S , 처리시간 T ( 공백으로 구분 )
      • S = 2016-09-15 hh:mm:ss.sss
      • T = 0.1s / 0.312s / 2s 같이 최대 소수점 셋째자리까지 초 단위로 나타냄
        • 처리시간은 시작시간 , 끝시간 모두 포함
        • 0.001 ≤ T ≤ 3.000
  2. return : 초당 최대 처리량
    • 요청의 응답 완료 여부에 관계없이 임의 시간부터 1초간 처리하는 요청의 최대개수

< 문제 핵심 >

  1. S와 T를 구분

    → split으로 S,T를 분리

    → T는 float형 숫자만 추출

  2. 시작시간 구하기

    1. timedelta를 이용하여 이전 시간 구하기
    2. 시작시간은 1밀리초 더 앞당겨야됨 ( 문제에 나와있음 )
  3. 1초 간격마다 요청 개수 구하기

    • 시작 시간과 끝난 시간 경계에 따라 각 요청들을 비교하기
    • 포함된 것을 cnt하기
  4. 최대 처리량 갱신

    • max를 이용

< 문제 아이디어 >

  • 시간문제 - datetime, timedelta 사용

< 코드 >

1. datetime 사용

from datetime import datetime,timedelta
def solution(lines):
    rangeList = []
    maxCnt = 0

    for line in lines:
        S = line[:23]
        T = line.split(" ")[2]
        endTime = datetime.strptime(S,'%Y-%m-%d %H:%M:%S.%f')
        startTime = endTime-timedelta(seconds=float(T[:len(T)-1]))+timedelta(milliseconds=1)
        rangeList.append((startTime,endTime))

    def cnt_secRange(standard):
        cnt = 0
        s = standard + timedelta(milliseconds=1000)
        e = standard
        for startStandard,endStandard in rangeList:
            if startStandard < s and endStandard >= e :
                cnt += 1
        return cnt

    for s,e in rangeList :
        maxCnt = max(maxCnt,cnt_secRange(s),cnt_secRange(e))

    return maxCnt

< 구현 방식 >

( 사용한 메소드, 라이브러리 등 원리 )

1. datetime 사용

1. datetime 사용

  • 객체 → 문자열 : strftime
  • 문자열 → 객체 : strptime

2. S, T, 시작시간, 끝난시간을 같은 형태로 구하기

  • timedelta를 이용하여 endTime에서 T만큼 이전 시간으로 만들어주기
    • timedelta(seconds=1) : 1초 후
    • -timedelta(millisecond=1) : 0.001초 전
  • 시작시간은 0.001초 더 앞당겨야됨 ( 1초 : 0~0.999초 ) : 문제 설명에 나와있음
  • 따라서 시작시간 = 끝난시간 - T + 0.001초

3. cnt_secRange()함수

  • rangeList의 rangeitem 시작시간 ~ 끝시간 범위안에 포함이 될 경우에만 cnt+=1
    • 처리시간은 시작시간, 끝시간의 경계에 따라 포함여부가 달라짐
    • standard는 시작시간보다 0.001초 후 끝난시간안에 있어야 하므로
      • 시작시간+0.001보다 커야하며
      • 끝난시간까지 포함

4.max()를 이용하여 계속 새로 갱신

  • max(a,b,c) 는 a,b,c 중 가장 큰 값이 반환됨
  • a는 현재 가장 최대처리량
  • b는 시작시간을 기준으로 cnt_secRange에 대입하여 실행한 처리량
  • c는 끝난시간을 기준으로 cnt_secRange에 대입하여 실행한 처리량

< 결과 >

1. datatime 사용

좋은 웹페이지 즐겨찾기