프로그래머스-2021 KAKAO BLIND RECRUITMENT ( 광고 삽입 by Java )

Flash·2022년 2월 16일
0

Programmers-Algorithm

목록 보기
35/52
post-thumbnail

구현

프로그래머스 2021 KAKAO BLIND RECRUITMENT Level 3 문제 광고 삽입Java를 이용해 풀어보았다. 풀진 못했고 그냥 풀이 보고 허망했다. 어떻게 저 생각을 시험 당시에 시간 압박까지 느끼며 풀지....? 그냥... 남의 풀이를 구경했다 ㅎㅎ.. 아따 나만 빼고 다덜 똑똑하누..

문제 링크 첨부한다.
https://programmers.co.kr/learn/courses/30/lessons/72414


시간 정보를 초단위로 바꾸기

문제에서 최대 시간을 99:59:59로 제한해놨기 때문에 1초 단위로 싹 바꾸면 0초부터 359,999 초까지 나온다. 즉, 36만개가 최대기 때문에 일차원 배열로 처리해서 풀면 된다. 몇 초에 몇 명이 봤는지 int[] visited 정보로 표현해서 겹치는 부분의 최댓값을 갱신하면 된다.

이 풀이를 대체 어떻게 생각하지? 하지만 생각을 할 수 있으면 쉬운 것 같긴 하다. 하지만 생각을 떠올릴 수 없기 때문에 아무런 의미는 없다. 어쩌라는 거지

별로 추가적인 설명을 달고 싶지 않은 문제다...
한계를 느낀다.. 띱..

아래는 내가 제출한 코드다.

public class AdPlacement {
    static String solution(String play_time, String adv_time, String[] logs) {
        int playTime = timeToSeconds(play_time);
        int advTime = timeToSeconds(adv_time);
        if(playTime==advTime)   return "00:00:00";
        int[] visited = new int[playTime+1];

        for(String log: logs){
            String[] times = log.split("-");
            int start = timeToSeconds(times[0]);
            int end = timeToSeconds(times[1]);

            for(int i=start; i<end; i++)
                visited[i]++;
        }
        /** 초기값 세팅 */
        int start = 0;
        int end = advTime;
        long sum = 0;
        for(int i=start; i<end; i++)
            sum += visited[i];

        /** 최대 누적 구간의 시작점 찾기 */
        long max = sum;
        long maxStart = start;
        while(end<=playTime){
            sum -= visited[start];
            sum += visited[end];

            if(sum>max){
                max = sum;
                maxStart = start + 1;
            }

            start++;
            end++;
        }

        return secondsToTime(maxStart);
    }

    static Integer timeToSeconds(String time){
        String[] split = time.split(":");
        int hrs = Integer.parseInt(split[0]);
        int mins = Integer.parseInt(split[1]);
        int secs = Integer.parseInt(split[2]);

        return hrs*3600 + mins*60 + secs;
    }

    static String secondsToTime(long seconds){
        int hrs = (int)seconds / 3600;
        int rest = (int)seconds % 3600;
        int mins = rest / 60;
        rest %= 60;
        int secs = rest;

        return String.format("%02d:%02d:%02d", hrs, mins, secs);
    }

    public static void main(String[] args) {
        String play_time = "02:03:55";
        String adv_time = "00:14:15";
        String[] logs = { "01:20:15-01:45:14", "00:40:31-01:00:00", "00:25:50-00:48:29", "01:30:59-01:53:29", "01:37:44-02:02:30" };
        String answer = solution(play_time, adv_time, logs);
        System.out.println(answer);
    }
}

오늘 배운 것

코테는 사람을 슬프게 만든다


2022.03.08 재시도 ( 실패 )

HH:mm:ss 형식을 초 단위로 바꾸는 건 이제 익숙해서 떠올릴 수 있었지만, 최대 누적 재생 구간을 구하는 건 정말... 또 저번에 풀었던 풀이를 더 개선해보겠다고 개뻘짓하다가 결국 gg치고 저번에 통과한 내 풀이를 다시 보니 한숨만 나온다. 이걸 어떻게 생각하냐고 제발...

하지만 또 잘 생각해보면 기껏해봐야 100시간을 초로 바꿔봤자 36만밖에 안 되니까 떠올릴 법하다는 생각도.. 들기도 하나..? 구현은 어렵다....ㅠ

profile
개발 빼고 다 하는 개발자

0개의 댓글