ALGORITHM/PROGRAMMERS

[프로그래머스] 추석 트래픽 (2018 KAKAO BLIND RECRUITMENT)

0298 2020. 12. 13. 21:05

programmers.co.kr/learn/courses/30/lessons/17676

 

코딩테스트 연습 - [1차] 추석 트래픽

입력: [ 2016-09-15 20:59:57.421 0.351s, 2016-09-15 20:59:58.233 1.181s, 2016-09-15 20:59:58.299 0.8s, 2016-09-15 20:59:58.688 1.041s, 2016-09-15 20:59:59.591 1.412s, 2016-09-15 21:00:00.464 1.466s, 2016-09-15 21:00:00.741 1.581s, 2016-09-15 21:00:00.748

programmers.co.kr

2020-12-13

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
import java.util.Arrays;
 
public class Solution17676 {
 
    public static void main(String[] args) {
        String[] lines = {"2016-09-15 00:00:00.000 2.3s""2016-09-15 23:59:59.999 0.1s"}; //test용
        int answer = 0;
 
        String str[] = new String[3];
        double store[][] = new double[lines.length][2]; //store start, end
        double start = 0//minStart
        
        for(int i = 0; i < lines.length; i++) {
            str = lines[i].split(" "); // split first
            double time = 0;
             String t1 = str[1]; // calc time
            String cal[] = t1.split(":");
            time += (3600*Double.parseDouble((cal[0])) + 60*Double.parseDouble((cal[1])) + Double.parseDouble(cal[2]));
            
            String g1 = str[2].replace("s"""); //gap 
            double gap = Double.parseDouble(g1);
            store[i][0= Double.parseDouble(String.format("%.3f", (time-gap+0.001)));
            store[i][1=  Double.parseDouble(String.format("%.3f", (time)));
        }
 
        double next = 0;
        for(int i = 0; i < lines.length; i++) {
            int count = 0;
            start = store[i][1];
            next =  Double.parseDouble(String.format("%.3f", (start + 0.999))); //0.999->1
            for(int j = 0; j < lines.length; j++) {
                if(store[j][1>= start && next >= store[j][0]) // start보다는 크거나 같고 next보다도 작거나같게
                    count++;
            }
            if(answer < count) answer = count;
        }
        System.out.println("answer " + answer);
    }
}
 
cs

#문제풀이 

1. hh:mm:ss.sss를 초 단위로 계산을 하였다. 3600*hh + 60*mm + ss.sss 로 환산하고 소수점 셋째짜리까지만 사용하도록 하였다. 

 

2. store라는 2차원 배열을 만들고 [i][0]번째에는 처리 시작시간을 [i][1]번째에는 처리 끝 시간을 각각 저장하였다. 

 

3. 처음에는 0.001, 0.01 단위로 모두 쪼개서 계산을 해보았는데 역시나 시간 초과가 났었다. 이 부분에서 고민을 많이했었는데, 약간 끼워맞추듯이(시간초과때문에 이것저것 해보다가) 끝 시간 기준으로 해봤는데 되었었다. 생각해보면 결국 로그의 처리량이 바뀌는 포인트가 끝 시간이기 때문에 기준점을 끝 시간으로 잡야아 하는 것 같다. 

 

그래서 각 로그의 끝 시간 지점을 start로 잡고, next는 끝 시간 + 0.999를 해주었다. 1이 아닌 이유는 범위를 체크할 때 시작시간, 끝시간이 모두 크거나(작거나) 같을 때를 기준으로 count하기 때문이다.

 

마지막으로 start(처리량의 끝)보다 끝 시간이 크거나 같으면서 next(start+0.999)보다는 시작시간이 작거나 같은 경우를 count 해주었다.