PROGRAMMERS 추석 트래픽

LONGNEW·2022년 7월 26일
0

BOJ

목록 보기
320/333

https://school.programmers.co.kr/learn/courses/30/lessons/17676

input :

  • lines : N(1 ≦ N ≦ 2,000)개의 로그 문자열
  • 로그 문자열 : [응답완료시간 S, 처리시간 T]
  • 응답완료시간 S : 고정 길이 2016-09-15 hh:mm:ss.sss 형식
  • 처리시간 T : 0.1s, 0.312s, 2s 와 같이 최대 소수점 셋째 자리까지 기록

  • 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초" 동안 처리된 요청을 의미한다. (처리시간은 시작시간과 끝시간을 포함)

  • lines 배열은 응답완료시간 S를 기준으로 오름차순 정렬되어 있다.

output :

  • solution 함수에서는 로그 데이터 lines 배열에 대해 초당 최대 처리량을 리턴

조건 :

  • 초당 최대 처리량은 요청의 응답 완료 여부에 관계없이 임의 시간부터 1초(=1,000밀리초)간 처리하는 요청의 최대 개수를 의미

예시 2개에서 모든 경우를 보여준다.
예시 2번에서 끝나는 시점과 두 번째 로그가 시작하는 구간에서 초당 최대 처리량이 2개가 되는 것을 볼 수 있고.
예시 3번에서 매우 많은 양의 로그를 통해서 결과를 낼 때를 보여준다.

idea

로그는 2000개 밖에 주지 않지만 시간으로 따졌을 떄 만들어야 하는 구간이 25만개라고 생각했다.
그리고 시작과 끝 점만 따지면 결과가 나올까 생각했다.

문제점

예제 2번에서 볼 수 있듯이 초를 기준으로 나누면 안 된다.
초로 나눈다면 3D 프린팅 처럼 해당 위치를 확인하면서 돌 수 있듯이 해야하는데 이는 불가능해 보인다.

해설

카카오 테크 해설
실제 풀이 참고

해설에서의 힌트처럼 언제 처리량이 바뀌는지를 확인한다면 쉽게 볼 수 있었다.
맨 처음 완료된 로그의 경우부터 따진다면 시작 지점보다 끝 지점에서 겹치는 지를 통해 해당 지점에 몇 번의 처리가 필요한 지를 볼 수 있다.

start - 999를 통해 이미 start가 고정된 end보다 작은지는 미리 판단 되기 때문에 이것도 포함 된다.

주의

입력 받은 T시간은 모두 0으로 채워져 있지 않다.
그래서 float으로 입력을 받아 1천을 곱하거나 아니면 0을 채워줘야 한다.

def solution(lines):
    answer = 0
    starts, ends = [], []

    for idx, data in enumerate(lines):
        data = data.split(" ")
        start, end = milli(data[1], data[2][:-1])
        starts.append(start)
        ends.append(end)

    for i in range(len(lines)):
        temp = 1
        now_end = ends[i]

        for j in range(i + 1, len(lines)):
            if starts[j] - 1000 + 1 <= now_end:
                temp += 1

        answer = max(answer, temp)

    return answer


def milli(time, excute):
    hr, minute, second = time.split(":")
    hr = int(hr) * 3600
    minute = int(minute) * 60
    second, millisecond = map(int, second.split("."))
    end = (hr + minute + second) * 1000 + millisecond

    if "." in excute:
        e_sec, e_mil = excute.split(".")
        excute = e_sec + e_mil
        
    while len(excute) != 4:    
        excute += "0"

    return end - int(excute) + 1, end

0개의 댓글