프로그래머스 LEVEL 3(광고 삽입)
-
사용 언어 : 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