Sangmun

프로그래머스 [1차] 추석 트래픽 python 본문

알고리즘/프로그래머스

프로그래머스 [1차] 추석 트래픽 python

상상2 2023. 4. 6. 22:38

https://school.programmers.co.kr/learn/courses/30/lessons/17676?language=python3 

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

프로그래머스에서 Level3로 분류된 문제이지만 굉장히 쉽다 중간의 까다로운 구현과정과 곂치는 구간에 대한 판단에서 실수가 있다면 헤멜수도 있을것 같다. 중요포인트는 아래와 같다.

 

* python timedelta를 이용하여 시간에 대한 계산을 간편하게 하기

* 트래픽이 곂치는 조건을 명확하게 파악하기

* 입력의 총 길이가 2000이 최대임으로 이중 for문 즉 완전탐색으로 곂치는 트래픽을 탐색해도 된다.

 

import datetime

def solution(lines):

    time_lines = []
    for line in lines:

        tmp = line.split()
        end = tmp[1]
        new_end = datetime.timedelta(hours=int(end[:2]), minutes=int(end[3:5]), \
                                     seconds=int(end[6:8]), milliseconds=int(end[9:]))

        seconds = tmp[2].split('.')
        second = seconds[0]

        # s만 딸랑 들어오는 case가 있음 짜증 ...
        try:
            mili_s = seconds[1][:-1]
        except:
            second = second.replace('s','')
            mili_s = 0

        second_delta = datetime.timedelta(seconds=int(second), milliseconds=int(mili_s))
        # 3초가 넘어가는 처리 요청은 timeout으로 3초로 처리함
        if second_delta > datetime.timedelta(seconds=3): second_delta = datetime.timedelta(seconds=3)
        second_delta -= datetime.timedelta(milliseconds=1)

        start = new_end - second_delta
        time_lines.append((start, new_end))

    result = []
    # 2중 for문으로 모든 케이스를 탐색
    for i in range(len(time_lines)):
        count = 0
        start_time = time_lines[i][1]
        end_time = start_time + datetime.timedelta(milliseconds=999)

        for j in range(len(time_lines)):

            tmp_start = time_lines[j][0]
            tmp_end = time_lines[j][1]

            # 곂치는지 안곂치는지 판단하는 조건
            if start_time <= tmp_end and tmp_start <= end_time:
                count += 1

        result.append(count)

    return max(result)
Comments