Algorithm

[프로그래머스 / 파이썬] [1차] 추석 트래픽

임쁘엔 2023. 7. 13. 22:26
 

프로그래머스

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

programmers.co.kr

정답 코드

from datetime import datetime, timedelta

def solution(lines):
    timeLogs = []
    for line in lines:
        date, time, duration = line.split(" ")
        endDate = datetime.strptime(date + "T" + time, "%Y-%m-%dT%H:%M:%S.%f")
        durationMs = float(duration[:-1]) * 1000
        startDate = endDate - timedelta(milliseconds=durationMs) + timedelta(milliseconds=1)
        timeLogs.append([startDate.timestamp() * 1000, endDate.timestamp() * 1000])

    maxCount = 0
    for i in range(len(timeLogs)):
        curEndTime = timeLogs[i][1]
        curCount = 0
        for j in range(len(timeLogs)):
            start, end = timeLogs[j]
            if start < curEndTime + 1000 and end >= curEndTime:
                curCount += 1
        maxCount = max(maxCount, curCount)

    return maxCount

문제 풀이

datetime 모듈로부터 datetime 클래스와 timedelta 클래스를 import 합니다.

timeLogs라는 빈 리스트를 생성합니다. 이 리스트는 추후에 로그 데이터를 저장하는 용도로 사용됩니다.

주어진 lines 리스트를 순회하면서 로그 데이터를 파싱하고 timeLogs 리스트에 저장합니다. 파싱 과정은 다음과 같습니다.

  • line을 공백을 기준으로 나누어서 date, time, duration 변수에 저장합니다.
  • date와 time을 결합하여 endDate 변수에 저장합니다. 이 때, strptime() 함수를 사용하여 문자열을 datetime 객체로 변환합니다.
  • duration에서 숫자 부분만 추출하여 float(duration[:-1])을 계산하고, 밀리초 단위로 변환한 값을 durationMs 변수에 저장합니다.
  • endDate에서 durationMs를 뺀 뒤, 1밀리초를 더해 startDate 변수에 저장합니다.
  • startDate와 endDate를 timestamp() 함수를 사용하여 밀리초 단위로 변환한 뒤, [startDate.timestamp() * 1000, endDate.timestamp() * 1000] 형태로 리스트에 추가합니다.

maxCount 변수를 0으로 초기화합니다. 이 변수는 추후 최대 처리량을 저장하는 용도로 사용됩니다.

이중 반복문을 사용하여 로그 데이터를 비교하고 처리량을 계산합니다. 외부 반복문은 timeLogs 리스트의 인덱스를 순회하며, 내부 반복문은 같은 리스트의 인덱스를 순회합니다.

  • 현재 로그 데이터의 종료 시간(curEndTime)을 기준으로, 다른 로그 데이터의 시작 시간과 종료 시간을 비교합니다.
  • 시작 시간이 curEndTime보다 1초 이내에 있고, 종료 시간이 curEndTime보다 크거나 같은 경우에 처리량을 증가시킵니다.
  • 내부 반복문이 종료된 후, 현재 처리량(curCount)과 최대 처리량(maxCount)을 비교하여 더 큰 값을 maxCount에 저장합니다.

최종적으로 계산된 최대 처리량을 반환합니다.