Algorithm

[Programmers] 추석 트래픽

프로그래민 2020. 8. 7. 00:35
반응형

파싱을 요하는 시뮬레이션 문제이다.

이 문제에서 요점은 입력으로 들어오는 시간을 밀리초(ms) 로 변환시키는 것과 트래픽의 변화가 생기는 것은 시작점과 끝점이라는 것을 파악하는 것이다. 모든 밀리초 시간을 확인할수 없으므로 시작점과 끝점의 1초를 확인하는 방식으로 푼다면 O(n*n) 시간안에 해결할 수 있는 문제이다.

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
71
72
73
74
75
76
77
package programmers;
 
import java.util.List;
import java.util.StringTokenizer;
 
public class Solution_2018카카오_추석트래픽 {
    
    static class Pos{
        long start,end;
        Pos(long s, long e){
            start=s;end=e;
        }
    }
    
    public static void main(String[] args) {
        String[] lines = {"2016-09-15 01:00:04.002 2.0s",
                "2016-09-15 01:00:07.000 2s"};
//        String[] lines = {"2016-09-15 01:00:04.001 2.0s",
//        "2016-09-15 01:00:07.000 2s"};
        
        System.out.println(solution(lines));
    }
    
    static int solution(String[] lines) {
        int total= lines.length;
        Pos[] arr=new Pos[total];
        
        int result=Integer.MIN_VALUE;
        
        for(int i=0;i<total;i++) {
            StringTokenizer st = new StringTokenizer(lines[i]);
            st.nextToken();    //날짜날리기
            
            long finishTime=0;
            
            StringTokenizer st2= new StringTokenizer(st.nextToken(),":.");
            finishTime+= Long.parseLong(st2.nextToken()) * 1000 * 60 * 60;    //시
            finishTime+= Long.parseLong(st2.nextToken()) * 1000 * 60;        //분
            finishTime+= Long.parseLong(st2.nextToken()) * 1000;            //초
            finishTime+= Long.parseLong(st2.nextToken());                    //밀리초
            
            
            st2= new StringTokenizer(st.nextToken().replace("s"""),".");
            long timeTakes = Long.parseLong(st2.nextToken())*1000;
            if(st2.hasMoreTokens()) {
                String temp=st2.nextToken();
                if(temp.length()==3) {
                    timeTakes+=Long.parseLong(temp);
                }else if(temp.length()==2) {
                    timeTakes+=Long.parseLong(temp)*10;
                }else if(temp.length()==1) {
                    timeTakes+=Long.parseLong(temp)*100;
                }
            }
            arr[i]=new Pos((long)(finishTime-timeTakes+1), finishTime);
        }
        
        for(int i=0;i<total;i++) {
            Pos cur=arr[i];
            int ans1=0;    int ans2=0
            for(int j=0;j<total;j++) {
                Pos next = arr[j];
                
                //start 뒤 1초
                if(cur.start<=next.end && cur.start+999 >=next.start)
                    ans1++;
                //end 뒤 1초
                if(cur.end<=next.end && cur.end+999 >=next.start)
                    ans2++;
            }
            result=Math.max(ans1, result);
            result=Math.max(ans2, result);
        }
        return result;
    }
}
 
                                 
반응형

'Algorithm' 카테고리의 다른 글

[BOJ] 2644. 촌수계산  (0) 2020.08.11
[BOJ] 1931. 회의실배정  (0) 2020.08.08
[Programmers] 실패율  (0) 2020.08.03
[Programmers] 입국심사  (0) 2020.07.30
[Programmers] 스킬트리  (0) 2020.07.30