[2021 카카오 블라인드] 광고 삽입 (JAVA)

Jiwoo Kim·2021년 5월 11일
0
post-thumbnail

문제


풀이

스스로 풀지 못해서 검색해서 풀이를 알아냈다. 풀이 보고 진짜 감탄했따.. 어떻게 이런 아이디어를 떠올릴 수 있는 걸까.... 진짜 인상깊었다...

logs의 길이가 30만이나 되기 때문에 최대한 효율적인 방법을 떠올려야 했는데, 배열을 저런 식으로 업데이트해서 활용할 수 있을 거라고는 상상도 못했다. 나도 이런 문제를 뚝딱 풀어내는 사람이 되고 싶다..ㅠㅠ

코드

class Solution {

    private static final int MAX = 59 + 59 * 60 + 99 * 3600;
    private static final int START = 0;
    private static final int END = 1;

    private int playDuration;
    private int advDuration;
    private long[] viewers = new long[MAX + 1];

    public String solution(String play_time, String adv_time, String[] logs) {
        parseInputs(play_time, adv_time, logs);
        return findBestAdvStartTime();
    }

    private void parseInputs(String play_time, String adv_time, String[] logs) {
        playDuration = Time.parseTextToSeconds(play_time);
        advDuration = Time.parseTextToSeconds(adv_time);
        parseLogs(logs);
    }

    private void parseLogs(String[] logs) {
        for (String log : logs) {
            String[] times = log.split("-");
            viewers[Time.parseTextToSeconds(times[START])]++;
            viewers[Time.parseTextToSeconds(times[END])]--;
        }
        updateViewers();
    }

    private void updateViewers() {
        for (int time = 1; time <= playDuration; time++)
            viewers[time] += viewers[time - 1];
        for (int time = 1; time <= playDuration; time++)
            viewers[time] += viewers[time - 1];
    }

    private String findBestAdvStartTime() {
        int advStartSeconds = 0;
        long max = viewers[advDuration];

        int startTime = 0, endTime = startTime + advDuration;
        while (endTime <= playDuration) {
            long current = viewers[endTime] - viewers[startTime];
            if (current > max) {
                advStartSeconds = startTime + 1;
                max = current;
            }

            startTime++;
            endTime++;
        }
        return Time.parseSecondsToText(advStartSeconds);
    }
}

class Time {

    private static final int HOUR = 0;
    private static final int MINUTE = 1;
    private static final int SECOND = 2;
    private static final int MINUTE_UNIT = 60;
    private static final int HOUR_UNIT = MINUTE_UNIT * MINUTE_UNIT;
    private static final String SPLITTER = ":";
    private static final String ZERO = "0";

    public static int parseTextToSeconds(String text) {
        String[] chunks = text.split(SPLITTER);
        return Integer.parseInt(chunks[HOUR]) * HOUR_UNIT
                + Integer.parseInt(chunks[MINUTE]) * MINUTE_UNIT
                + Integer.parseInt(chunks[SECOND]);
    }

    public static String parseSecondsToText(int value) {
        StringBuilder sb = new StringBuilder();

        int hour = value / HOUR_UNIT;
        if (hour < 10) sb.append(ZERO);
        sb.append(value / HOUR_UNIT).append(SPLITTER);

        int minute = value % HOUR_UNIT / MINUTE_UNIT;
        if (minute < 10) sb.append(ZERO);
        sb.append(minute).append(SPLITTER);

        int second = value % MINUTE_UNIT;
        if (second < 10) sb.append(ZERO);
        sb.append(value % MINUTE_UNIT);

        return sb.toString();
    }
}

참고

[프로그래머스] 광고 삽입 / 2021 KAKAO BLIND RECRUITMENT - JAVA

0개의 댓글