🕊 Link

Lv3. [1차] 추석 트래픽 python
https://programmers.co.kr/learn/courses/30/lessons/17676

💡 Solution

from datetime import datetime

def solution(lines):
    range_list = []
    pointer_list = []

    for line in lines: # input 배열을 한 줄 씩 돌면서 split으로 나누고 각 변수에 할당
        dt = line.split()[0] + " " + line.split()[1]
        dr = line.split()[2]
        # ex) "2016-09-15 01:00:04.001 2.0s",
        # dt = 2016-09-15 01:00:04.001
        # dr = 2.0s

        dt = datetime.strptime(dt, "%Y-%m-%d %H:%M:%S.%f")
        # strptime을 통한 dt 형식 변환 : 문자열(기존) >> 날짜(변경)
        # 참고1 : https://inma.tistory.com/96
        # 참고2 :https://pythonq.com/so/python/92346

        dr = int(float(dr[:-1]) * 1000)
        # dr[:-1]을 통해 맨 뒤 문자열 "s" 제거,
        # float()함수를 통해 타입 변경 : 문자열(기존) >> 실수(변경)
        # * 1000을 통해 단위 변경 : 초(기존) >> 밀리초(변경)
        # int()를 통해서 타입 변경 : 실수(기존) >> 정수(변경)
        # ex) dr = 2.0s(기존) >> 2000(변경)

        
        end = (dt.second + dt.minute*60 + dt.hour*3600) * 1000 + dt.microsecond//1000
        # line의 dt는 처리가 끝난 시각이 기록되어있고, 끝난 시각을 밀리초로 환산하여 end 변수에 할당.

        # 1. hour, minute, second를 각각 단위에 맞게 계산하여 초로 변환 후 * 1000 = millisecond로 변환
        # 2. microsecond를 구하고 //1000을 통해서 millisecond를 구해서 더해줌

        start = end - dr + 1
        # end = dt = 처리가 끝난 시각
        # start = 처리가 끝난 시각 - 걸린 시각 + 1 = 처리 시작 시각


        # 문제를 잘 읽어보면 +1을 해야하는 이유가 나옴
        # ex) 2016-09-15 03:10:33.020 0.011s
        # "2016년 9월 15일 오전 3시 10분 33.010초"부터 
        # "2016년 9월 15일 오전 3시 10분 33.020초"까지 "0.011초"

        # 걸린 시각만 빼고 +1을 해주지 않으면
        # "2016년 9월 15일 오전 3시 10분 33.009초"부터가 되니까 오류. 즉 +1 을 해줘야함.        

        pointer_list.append(start)
        pointer_list.append(end)
        range_list.append((start, end))
        # pointer_list에 start, end 포인트를 각각 넣어주고,
        # range_list에는 start, end를 묶은 범위 tuple을 넣어줌.

        # 여기서부터 잘 생각해야하는게,
        # 문제에서 원하는 답은 최대 처리량을 갖는 "1초" 구간임.
        # 최대 값은 start나 end 포인트를 기점으로 나옴.
        # why? 그 외에 범위에서는 변화가 없기 때문.

        # 따라서, start, end 포인트를 시작으로 1초 즉, point + 999 의 범위 내에
        # range_list에 넣은 놈들이 포함되냐 안되냐를 count하고 그 max 값을 찾으면 됨.


    # pointer_list를 돌면서 각 pointer로부터 +999의 범위 내에 range_list의 놈들이 포함되려면,
    # 아래 첨부한 사진을 참조해서 
    # 1. range의 end가 point보다 작거나(앞이거나)
    # 2. range의 start가 point+999보다 크거나(뒤거나)
    # 위의 두 경우는 우리가 구하고 싶은 범위에 포함되지 않으니 "넘어가고"
    # 그 경우들을 제외한 나머지 경우에 대해서 count+1을 해줄거다.

		# 이 내용이 바로 아래 for 문 중에 
	  # if not(range_item[1] < pointer) and not(range_item[0] > pointer + 999):
		#     count += 1


    # 각 변수 세팅
    max_count = 0
    count = 0

    for pointer in pointer_list:
        count = 0
        # pointer_list를 돌면서 start 혹은 end 포인트를 꺼내오고
        # 새 pointer를 가져올 때, count = 0 초기화
        for range_item in range_list:
            if not(range_item[1] < pointer) and not(range_item[0] > pointer + 999):
                count += 1

                # 각 pointer와 range를 돌면서 새로운 최고값이 나오면 max_count를 갱신
                if count > max_count:
                    max_count = count

    return max_count # 마지막으로 max-count 리턴

# test code
lines3 = [
    "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 2.31s",
    "2016-09-15 21:00:00.966 0.381s",
    "2016-09-15 21:00:02.066 2.62s"
]

print("here", solution(lines3))

🧑🏻‍💻 Code(python)

from datetime import datetime
from operator import itemgetter

def solution(lines):
    range_list = []
    pointer_list = []

    for line in lines: 
        dt = line.split()[0] + " " + line.split()[1]
        dr = line.split()[2]
        dt = datetime.strptime(dt, "%Y-%m-%d %H:%M:%S.%f")
        dr = int(float(dr[:-1]) * 1000)

        end = (dt.second + dt.minute*60 + dt.hour*3600) * 1000 + dt.microsecond//1000
        start = end - dr + 1

        pointer_list.append(start)
        pointer_list.append(end)
        range_list.append((start, end))

    max_count = 0
    count = 0
    for pointer in pointer_list:
        count = 0
        for range_item in range_list:
            if not(range_item[1] < pointer) and not(range_item[0] > pointer + 999):
                count += 1
                if count > max_count:
                    max_count = count
    return max_count

👨🏻‍💻💭 Self Feedback

초반에 시간 단위로 변환해서 풀이한 방법이 주효했던 것으로 판단.
이외에 다양한 경로로 생각해보는 노력이 필요.


  • 2021.04.14 - 최초 작성

댓글 환영 질문 환영 by.protect-me

profile
protect me from what i want

0개의 댓글