ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [1차] 추석 트래픽
    코딩 테스트/Level 3 2020. 10. 4. 12:26
    반응형

    [1차] 추석 트래픽
    2018 KAKAO BLIND RECRUITMENT
    1558명 완료

    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-15 21:00:00.748

    programmers.co.kr

    시간을 다루는 문제는 항상 쉽지 않다 ㅠ,.ㅠ 
    경계를 포함하는지 마는지에 따라 결과가 달라진다.

    이 문제에도 약간 혼란스러웠던 것이,
    마지막 0.001초를 포함하기 때문에, 
    시작점도 0.001초 당겨줘야 한다. 

    그리고 그 시점에서 최대 트래픽이 아니라,
    초당 최대 트래픽이라... 1초간의 트래픽을 생각해 줘야 한다. 

    쉽게 풀기 위해 datetime 모듈을 사용했다. 
    문자열에서 시간을 파싱하는 것은 str'p'time이고,
    시간을 문자열 포매팅으로 변환하는 것은 str'f'time이다. 
    시간을 더하거나 뺄 때는 timedelta를 이용한다. 

    from datetime import datetime, timedelta
    
    
    def parse(line):
        end = datetime.strptime(line[:23], '%Y-%m-%d %H:%M:%S.%f')
        start = end - timedelta(seconds=float(line[24:][:-1])) + timedelta(seconds=0.001)
        return start, end
    
    
    def solution(lines):
        checkers = set()
        for i, line in enumerate(lines):
            lines[i] = parse(line)
            checkers.update(lines[i])
        start_count, end_count = dict(), dict()
        for line_start, line_end in lines:
            for checker in checkers:
                if line_start - timedelta(seconds=1) < checker <= line_end:
                    start_count[checker] = start_count.get(checker, 0) + 1
                if line_start <= checker < line_end + timedelta(seconds=1):
                    end_count[checker] = end_count.get(checker, 0) + 1
        return max(*start_count.values(), *end_count.values())
    테스트 1 〉	통과 (2.02ms, 11.3MB)
    테스트 2 〉	통과 (1588.64ms, 11.8MB)
    테스트 3 〉	통과 (1674.34ms, 11.8MB)
    테스트 4 〉	통과 (1.77ms, 11.1MB)
    테스트 5 〉	통과 (23.46ms, 11.3MB)
    테스트 6 〉	통과 (22.35ms, 11.2MB)
    테스트 7 〉	통과 (1614.00ms, 11.8MB)
    테스트 8 〉	통과 (1590.38ms, 11.9MB)
    테스트 9 〉	통과 (17.84ms, 11.2MB)
    테스트 10 〉	통과 (1.94ms, 11.3MB)
    테스트 11 〉	통과 (1.89ms, 11.3MB)
    테스트 12 〉	통과 (1592.05ms, 11.8MB)
    테스트 13 〉	통과 (24.19ms, 11.3MB)
    테스트 14 〉	통과 (1.74ms, 11.3MB)
    테스트 15 〉	통과 (1.75ms, 11.1MB)
    테스트 16 〉	통과 (1.73ms, 11.3MB)
    테스트 17 〉	통과 (1.74ms, 11.3MB)
    테스트 18 〉	통과 (5766.12ms, 12.4MB)
    테스트 19 〉	통과 (6689.82ms, 12.5MB)
    테스트 20 〉	통과 (6311.65ms, 12.4MB)
    테스트 21 〉	통과 (1.70ms, 11.3MB)
    테스트 22 〉	통과 (1.70ms, 11.3MB)

    결론만 이야기하자면 
    순간 최대 트래픽은 각 트래픽의 시작과 완료 시점 주위이다.
    가장 어려웠던 건 조건문에서 넣고 빼고 하는 과정 ㅠ,.ㅠ
    완성 후 생각하면 왜 어려웠나 싶지만..
    푸는 중에는... 

    덕분에 datetime 모듈은 원 없이 만져 봄..
    이렇게 열심히 만져본 건 처음..

    더 효율적으로 풀 수 있는 방법도 있는데....

    반응형
Designed by Tistory.