프로그래밍 공방

[프로그래머스] 추석 트래픽 본문

개발/문제해결

[프로그래머스] 추석 트래픽

hyosupsong 2020. 11. 22. 22:30

문제

https://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

문제해결방법

입력값으로 받는 hh:mm:ss.sss과 처리시간 Ts 를 이용해서 트래픽의 시작 시간들을 정렬한 배열 startTime과 끝나는 시간들의 배열 endTime을 구한다.

startTime을 앞에서부터 탐색하며 하나 돌 때마다 트래픽의 개수를 1개 더한다.

startTime 하나를 볼 때 endTime 배열을 앞에서부터 보며 startTime[i]-999(1s간 처리)보다 작으면 트래픽을 하나씩 빼준다.

startTime을 볼 때마다 위 방법으로 트래픽을 계산해서 그 중 최댓값을 출력한다.

POINT

1. 처음에 .이 들어간 시간을 처리하기 위해 Float.parseFloat 을 사용해서 실수로 바꾸고 1000을 곱해서 계산해주었는데 float 자료형을 이용하다보니까 계산에 차이가 생겼고 int로 변환하는 과정에서 값의 변경이 발생했다.

2. JAVA에서 Split을 쓸 때 정규표현식을 이용해 나누기 때문에 "." 로 나누고 싶다면 "\\." 로 해줘야 한다.

코드

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
package Programmers;
 
import java.util.Arrays;
 
public class Solution_추석트래픽 {
 
    public static int tToInt(String t) {
        if(t.charAt(t.length()-1)=='s') t = t.substring(0, t.length()-1);
        String[] num = t.split("\\.");
        int result = 0;
        int n = 1000;
        for(int i=0; i<num.length; i++) {
            result += Integer.parseInt(num[i])*n;
            n/=1000;
        }
        return result;
    }
    
    public static int stringToInt(String t) {
        int time = 0;
        String[] s = t.split(":");
        time += Integer.parseInt(s[0])*3600000;
        time += Integer.parseInt(s[1])*60000;
        time += tToInt(s[2]);
        return time;
    }
 
    public static int[] logToIntArray(String log) {
        String[] logs = log.split(" ");
        int endTime = stringToInt(logs[1]);
        int T = tToInt(logs[2]);
        int startTime = endTime-T+1;
        return new int[]{startTime, endTime};
    }
 
    public static int solution(String[] lines) {
        int answer = 0;
        int[] startList = new int[lines.length];
        int[] endList = new int[lines.length];
        
        for(int i=0; i<lines.length; i++) {
            int[] times = logToIntArray(lines[i]);
            startList[i] = times[0];
            endList[i] = times[1];
        }
        Arrays.sort(startList);
        Arrays.sort(endList);
        int traffic = 0;
        int ei = 0;
        for(int i=0; i<startList.length; i++) {
            traffic++;
            for(int j=ei; j<endList.length; j++) {
                if(endList[j]<startList[i]-999) traffic--;
                else {
                    ei = j;
                    break;
                }
            }
            if(answer<traffic) answer = traffic;
        }
        return answer;
    }
    
    public static void main(String[] args) {
        String[] lines = {"2016-09-15 01:00:07.000 2s""2016-09-15 01:00:04.002 2.0s"};
        System.out.println(solution(lines));
    }
}
cs


코드에 대한 피드백이나 더 좋은 아이디어는 언제나 환영입니다.