본문 바로가기
Algorithm/프로그래머스풀이

[알고리즘 문제풀이] 프로그래머스 - 광고 삽입 / JAVA(자바)

by 계범 2022. 2. 18.

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

 

코딩테스트 연습 - 광고 삽입

시간을 나타내는 HH, H1, H2의 범위는 00~99, 분을 나타내는 MM, M1, M2의 범위는 00~59, 초를 나타내는 SS, S1, S2의 범위는 00~59까지 사용됩니다. 잘못된 시각은 입력으로 주어지지 않습니다. (예: 04:60:24, 11

programmers.co.kr

/**
    1. 초 단위로 누적합 진행
    1-1) 1시간 = 3600초
        최대 100시간 = 360,000 초
    1-2) 초단위 배열을 생성 후 누적합으로 각 초에 몇명이 봤는지 계산
    
    2. 초단위 배열에서 각 초 별 누적 재생시간으로 배열 변경
    2-1) 누적합 사용
    
    4. 누적합으로 해당 범위 계산 최대값 중 가장 빠른 시간 반환
    
    *주의*
    
    시청기간은 시작 이상 종료 미만...
**/


class Solution {
    public String solution(String play_time, String adv_time, String[] logs) {
        
         int len = timeParsing(play_time);
        
        long[] sArr = new long[len+2];
        
        for(String log : logs){
            String[] strs = log.split("-");
            
            int start = timeParsing(strs[0]);
            int end = timeParsing(strs[1]);
            
            sArr[start] += 1;
            sArr[end] -= 1;
        }
        
        // 각 시간대별 시청사람 수
        for(int i = 1; i <= len; i++){
            sArr[i] += sArr[i-1];
        }
        
        // 각 시간대별 누적 시청시간
        for(int i = 1; i <= len; i++){
            sArr[i] += sArr[i-1];
        }
        
        int adv = timeParsing(adv_time);
        
        //미만의 누적합값을 초기값 설정
        long max = sArr[adv-1];
        int cur = 0;
        
        // 1초부터 확인
        for(int i = 0; i+adv <= len; i++){
            long sum = sArr[i+adv]-sArr[i];
            
            if(sum > max){
                max = sum;
                cur = i+1;
            }
        }
        
        System.out.println(max);
        String answer = stringParsing(cur);
        
        return answer;
    }
    
    public String stringParsing(int max){
        
        String result = "";
        
        int h = max/3600;
        
        max%= 3600;
        int m = max/60;
        
        max %= 60;
        int s = max;
        result += String.format("%02d:%02d:%02d",h,m,s);
        
        return result;
    }
    
    public int timeParsing(String time){
        int result = 0;
        String[] times = time.split(":");
        
        result += Integer.parseInt(times[0])*3600;
        result += Integer.parseInt(times[1])*60;
        result += Integer.parseInt(times[2]);
        
        return result;
    }
}

댓글