3Level [1차] 추석트래픽
< 문제 이해 >
- lines배열
- S 기준 오름차순으로 정렬
- 로그문자열로 이루어짐
- 로그 문자열 = 응답완료시간 S , 처리시간 T ( 공백으로 구분 )
- S = 2016-09-15 hh:mm:ss.sss
- T = 0.1s / 0.312s / 2s 같이 최대 소수점 셋째자리까지 초 단위로 나타냄
- 처리시간은 시작시간 , 끝시간 모두 포함
- 0.001 ≤ T ≤ 3.000
- return : 초당 최대 처리량
- 요청의 응답 완료 여부에 관계없이 임의 시간부터 1초간 처리하는 요청의 최대개수
< 문제 핵심 >
-
S와 T를 구분
→ split으로 S,T를 분리
→ T는 float형 숫자만 추출
-
시작시간 구하기
- timedelta를 이용하여 이전 시간 구하기
- 시작시간은 1밀리초 더 앞당겨야됨 ( 문제에 나와있음 )
-
1초 간격마다 요청 개수 구하기
- 시작 시간과 끝난 시간 경계에 따라 각 요청들을 비교하기
- 포함된 것을 cnt하기
-
최대 처리량 갱신
- 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
< 구현 방식 >
- S 기준 오름차순으로 정렬
- 로그문자열로 이루어짐
- 로그 문자열 = 응답완료시간 S , 처리시간 T ( 공백으로 구분 )
- S = 2016-09-15 hh:mm:ss.sss
- T = 0.1s / 0.312s / 2s 같이 최대 소수점 셋째자리까지 초 단위로 나타냄
- 처리시간은 시작시간 , 끝시간 모두 포함
- 0.001 ≤ T ≤ 3.000
- 요청의 응답 완료 여부에 관계없이 임의 시간부터 1초간 처리하는 요청의 최대개수
-
S와 T를 구분
→ split으로 S,T를 분리
→ T는 float형 숫자만 추출
-
시작시간 구하기
- timedelta를 이용하여 이전 시간 구하기
- 시작시간은 1밀리초 더 앞당겨야됨 ( 문제에 나와있음 )
-
1초 간격마다 요청 개수 구하기
- 시작 시간과 끝난 시간 경계에 따라 각 요청들을 비교하기
- 포함된 것을 cnt하기
-
최대 처리량 갱신
- 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 사용
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 사용
Author And Source
이 문제에 관하여(3Level [1차] 추석트래픽), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@hayeon/3Level-1차-추석트래픽저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)