프로그래머스 LEVEL 3(광고 삽입)

image

  • 사용 언어 : javascript

  • 해결 날짜 : 2023-05-08

  • 해결 방법 :

    • 누적합을 통해 문제 해결
      • 계산의 용이성을 위해 hhmmss 형식을 seconds로 변환
      • logs를 돌며 누적합 시작 위치, 끝 위치 저장
      • 누적합 계산
        • 첫번째 누적합은 해당 시간대의 시청자 수
        • 두번째 누적합은 해당 시간대까지의 누적 시청자 수
      • 광고 삽입했을 때 최대가 되도록 max값 갱신
  • 회고 :

    • x
  • 코드

    const hhmmssToSeconds = (hhmmss) => {
      const [hh, mm, ss] = hhmmss.split(':').map((s) => +s);
    
      return hh * 3600 + mm * 60 + ss;
    };
    
    const secondsToHhmmss = (seconds) => {
      const hh = Math.floor(seconds / 3600)
        .toString()
        .padStart(2, '0');
      const mm = Math.floor((seconds % 3600) / 60)
        .toString()
        .padStart(2, '0');
      const ss = ((seconds % 3600) % 60).toString().padStart(2, '0');
    
      return `${hh}:${mm}:${ss}`;
    };
    
    function solution(play_time, adv_time, logs) {
      const pt = hhmmssToSeconds(play_time);
      const at = hhmmssToSeconds(adv_time);
      const prefixSum = Array.from({ length: pt + 1 }, () => 0);
    
      logs.forEach((log) => {
        const [s, e] = log.split('-').map((v) => hhmmssToSeconds(v));
    
        prefixSum[s] += 1;
        prefixSum[e] -= 1;
      });
    
      for (let i = 1; i <= pt; i++) {
        prefixSum[i] += prefixSum[i - 1];
      }
    
      for (let i = 1; i <= pt; i++) {
        prefixSum[i] += prefixSum[i - 1];
      }
    
      let result = 0;
      let max = prefixSum[at];
    
      for (let i = 1; i <= pt - at; i++) {
        if (max < prefixSum[i + at] - prefixSum[i]) {
          max = prefixSum[i + at] - prefixSum[i];
          result = i + 1;
        }
      }
    
      return secondsToHhmmss(result);
    }
    
  • 출처: 프로그래머스 코딩 테스트 연습, https://school.programmers.co.kr/learn/challenges