몸과 마음이 건전한 SW 개발자

프로그래머스 [Lv. 3] [1차] 추석 트래픽 {언어 : JavaScript} [다시 풀어 보기] 본문

알고리즘/다시 풀어 보기

프로그래머스 [Lv. 3] [1차] 추석 트래픽 {언어 : JavaScript} [다시 풀어 보기]

스위태니 2024. 8. 26. 16:20

문제 링크

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

 

프로그래머스

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

programmers.co.kr

정답 코드

function solution(lines) {
    let maxThroughputPerSeconds = 0;

    const newLines = lines.map((line) => {
        const [date, time, duration] = line.split(" ");
        const [hh, mm, ssss] = time.split(":");
        const [ss, sss] = ssss.split(".");
        const endTime = (parseInt(hh) * 3600 + parseInt(mm) * 60 + parseInt(ss)) * 1000 + parseInt(sss);
        const throughput = parseFloat(duration.slice(0, -1)) * 1000;
        const startTime = endTime - throughput + 1; // 시작 시간은 종료 시간에서 처리 시간을 뺀 것
        return [startTime, endTime];
    });

    const n = newLines.length;
    for (let idx = 0; idx < n; idx++) {
        let cnt = 0;
        const [_, endTime] = newLines[idx];
        const windowEnd = endTime + 1000;

        for (let jdx = 0; jdx < n; jdx++) {
            const [startTime, _] = newLines[jdx];
            if (startTime < windowEnd && newLines[jdx][1] >= endTime) {
                cnt += 1;
            }
        }

        maxThroughputPerSeconds = Math.max(maxThroughputPerSeconds, cnt);
    }

    return maxThroughputPerSeconds;
}

풀이 방법

 

  1. 시간 파싱 및 변환:
    • 로그 문자열을 분해하여, 시각을 밀리초 단위로 변환한다. 종료 시각과 시작 시각을 각각 계산한다.
  2. 윈도우 내 요청 수 계산:
    • 각 로그의 종료 시각을 기준으로 1초의 윈도우를 설정한다.
    • 이 윈도우 내에 포함되는 모든 요청(해당 요청의 시작 시각과 종료 시각이 윈도우 내에 있는지 확인)을 카운트한다.
  3. 최대 처리량 비교:
    • 모든 로그에 대해 윈도우 내의 요청 수를 비교하고, 그중 최대 값을 저장한다.
  4. 결과 반환:
    • 최대 처리량을 반환하면 끝!

 

 

느낀점

  • 그리디는 여전히 어렵다.