알고리즘 풀이/프로그래머스

[프로그래머스][JAVA] 광고 삽입 (브루트 포스, 완전 탐색, 투포인터)

배게 2021. 9. 8. 19:25
728x90

다시 풀었는데 테캐 1개틀림

[인덱스 부분 실수한거임.. 인덱스가 ㅈㄴ 중요함 진짜 실수 많이함 이부분에서]

 

-> start end 한칸씩 이동해주는 것을 투포인터 알고리즘이라고 하나봄

 

가장 중요한 점은.. adv_time을 1칸씩 옮기는 개념인데..

나같은 경우는 당연히 0부터 시작해서 adv_time에 해당하는 index가 가진 값 박아주고

또 1부터 시작해서 index+1까지 박아주고 멍청하게 했음..

[앞에 인덱스의 값 1개 지우고 뒤에 인덱스의 값 1개 추가하면됨]

 

출처 : https://www.youtube.com/watch?v=Xx5bk_EP8tQ

해설에는 완전 탐색, 브루트 포스인데 케이스 2개가 틀림 1개는 시간 초과, 하나는 그냥 틀린 것

알고보니 나는 무식하게 광고시간을 한칸씩 옮겼는데 그럴 필요 없이 처음 구한 것에서

첫번째 인덱스 값 빼주고 마지막인덱스+1에 해당하는 다음 값을 넣어주면서 이동시켜주면 됐다..

 

그렇게 바꿔줬는데 갑자기 테케 2번

실행한 결괏값 "69:59:59"이(가) 기댓값 "01:00:00"와(과) 다릅니다.

이렇게 뜸.. 뒤에 있는 값으로 갱신 됐음

계속 해매는 중.. 

 

공식에서 오류가 있었다..

total_viewer = total_viewer + viewer[i] - viewer[i-advSec];를

total_viewer = max_viewer+ viewer[i] - viewer[i-advSec]; 이렇게 씀..

 

total_viewer의 값에서 앞에는 빼주고 뒤는 더해주는 식을 작성하려면 기본값이 total_viewer이어야 하는데

왠 엉뚱한 max_viewer를 넣어줘서 이렇게 됐나보다...

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
import java.text.DecimalFormat;
import java.util.StringTokenizer;
 
class Solution {
    static int[] viewer;
    
    public static String solution(String play_time, String adv_time, String[] logs) {
        
        int playSec = totalSec(play_time);
        int advSec = totalSec(adv_time);
//        System.out.println(ptSec);
        viewer = new int[playSec];
        
        
        
        for(String log : logs) {
            String[] log_time = log.split("-");
            
            int start = totalSec(log_time[0]);
            int end = totalSec(log_time[1]);
            
            for(int i=start; i<end; i++) {
                viewer[i]++;
            }
        }
        
        
        
        long total_viewer = 0;
        for(int i=0; i<advSec;i++){
            total_viewer+=viewer[i];
        }
        
        int resultSec = 0;
        long max_viewer =total_viewer;
        for(int i=advSec; i<playSec; i++){
            total_viewer = total_viewer + viewer[i] - viewer[i-advSec];
            if(total_viewer>max_viewer){
                max_viewer=total_viewer;
                resultSec=i-advSec+1;
                
                if(resultSec==70*3600-1 || resultSec==3600){
                    System.out.println(max_viewer);
                }
            }
        }
        
        
        DecimalFormat df = new DecimalFormat("00");
        StringBuilder sBuilder = new StringBuilder();
        
        sBuilder.append(df.format(resultSec/3600)+":");
        resultSec%=3600;
        sBuilder.append(df.format(resultSec/60)+":");
        resultSec%=60;        
        sBuilder.append(df.format(resultSec));
        
        String answer = sBuilder.toString();
        return answer;
    }
    
    private static int totalSec(String time) {
        StringTokenizer stk = new StringTokenizer(time,":");
        int totalSec = 
                Integer.parseInt(stk.nextToken())*60*60+
                Integer.parseInt(stk.nextToken())*60+
                Integer.parseInt(stk.nextToken());
        return totalSec;
    }
}
cs