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

프로그래머스 [Lv. 3] 광고 삽입 {언어 : JavaScript} [다시 풀어 보기] 본문

알고리즘/다시 풀어 보기

프로그래머스 [Lv. 3] 광고 삽입 {언어 : JavaScript} [다시 풀어 보기]

스위태니 2024. 7. 24. 18:13

문제 링크

https://school.programmers.co.kr/learn/courses/30/lessons/72414?language=javascript

 

프로그래머스

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

programmers.co.kr

정답 코드

function solution(play_time, adv_time, logs) {
    function calTime(time) {
        const [hours, minutes, seconds] = time.split(":");
        return parseInt(hours * 3600 + minutes * 60 + seconds * 1);
    };
    
    function timeFormatter(time) {
        const h = Math.floor(time / 3600);
        const m = Math.floor(time % 3600 / 60);
        const s = time % 60;
        const strH = h > 9 ? h : "0" + h;
        const strM = m > 9 ? m : "0" + m;
        const strS = s > 9 ? s : "0" + s;
        return `${strH}:${strM}:${strS}`
    };
    const pTime = calTime(play_time);
    const aTime = calTime(adv_time);
    timeFormatter(pTime)
    
    const dp = new Array(pTime).fill().map(() => 0);
    logs.forEach((e) => {
        const [start, to] = e.split("-");
        const calS = calTime(start)
        const calT = calTime(to)
        dp[calS]++;
        dp[calT]--;
    });
    
    // 시청자수
    for (let idx = 1; idx <= pTime; idx++) {
        dp[idx] += dp[idx-1];
    };
    // 누적 시청자수
    for (let jdx = 1; jdx <= pTime; jdx++) {
        dp[jdx] += dp[jdx-1];
    };
    
    let cnt = dp[aTime-1];
    let currentTime = 0;
    
    for (let kdx = aTime-1; kdx < pTime; kdx++) {
        const diff = dp[kdx] - dp[kdx-aTime];
        if (cnt < diff) {
            cnt = diff;
            currentTime = kdx - aTime + 1;
        };
    };
    var answer = timeFormatter(currentTime);
    return answer;
}

풀이 방법

https://sound-programming.tistory.com/295

 

프로그래머스 [Lv. 3] 파괴되지 않은 건물 {언어 : Python} [다시 풀어 보기]

문제 링크https://school.programmers.co.kr/learn/courses/30/lessons/92344?language=python3 프로그래머스코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나

sound-programming.tistory.com

  • 누적합 관련된 문제로 위의 풀이를 보면 쉽게?이해할 수 있다.
  1. 시청자수를 구하고 다시 누적해서 누적 시청자수를 구한다.
    1. 누적된 후 뒤에서 앞을 빼면 현재 범위에 시청하는 사람 수를 계산할 수 있다.
  2. 가장 많은 사람이 시청하는 범위를 찾고 현재 위치를 저장한 후 반환하면 끝!

느낀점

  • 과연 누적합 문제라는 것을 알았어도 바로 풀 수 있었을까?