[프로그래머스] 19598: 광고 삽입 - JAVA

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

풀이

시청자의 시청 시작, 종료 시각이 주어지고, 광고 지속 시간이 주어진다.

광고 지속 시간동안 누적 재생 시간이 가장 많은 구간을 골라야 한다.

누적합을 이용했다. 시청 시작시간에 +1 하고, 종료시간에 -1을 해놓고

누적합 배열을 끝까지 가면서 preSum[i] += preSum[i - 1] 해줬다.

누적합 배열을 완성한 후, 0 ~ 광고시간 까지를 첫 기준으로 삼아 1씩 늘려가면서 비교하며 갱신해주었다.


메모리: 77.8MB

시간: 20.35ms

언어: Java 11

코드

class Solution {
    public String solution(String play_time, String adv_time, String[] logs) {
        int playTime = calTime(play_time);
        int advTime = calTime(adv_time);

        // 로그 배열에서 시작시간, 동료시간 구해서 누적합 배열에 시작시간++, 종료시간--
        int[] preSum = new int[playTime + 2];
        for(int i = 0; i < logs.length; i++) {
            int start = calTime(logs[i].split("-")[0]);
            int end = calTime(logs[i].split("-")[1]);
            preSum[start]++;
            preSum[end]--;
        }

        // 누적합 완성
        for(int i = 1; i < playTime + 1; i++) {
            preSum[i] += preSum[i - 1];
        }

        // 0 ~ 광고시간: 처음 합계
        long sum = 0;
        for(int i = 0; i < advTime; i++) {
            sum += preSum[i];
        }

        // 첫 합계를 max로 두고
        // i가 시작시간, adv가 종료시간으로 놓고 1씩 증가시키면서 비교
        long max = sum;
        int ans = 0;
        int adv = advTime;
        for(int i = 0; i < playTime - advTime; i++) {
            sum += preSum[adv++] - preSum[i];
            if(max < sum) {
                max = sum;
                ans = i + 1;
            }
        }

        return returnTime(ans);
    }

    private static int calTime(String str) {
        int h = Integer.parseInt(str.split(":")[0]);
        int m = Integer.parseInt(str.split(":")[1]);
        int s = Integer.parseInt(str.split(":")[2]);

        return h * 3600 + m * 60 + s;
    }

    private static String returnTime(int i) {
        String h = String.format("%02d", i / 3600);
        i%= 3600;
        String m = String.format("%02d", i / 60);
        i %= 60;
        String s = String.format("%02d", i);

        return h + ":" + m + ":" + s;
    }
}