일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 고모네 콩탕
- 2020 KAKAO BLIND
- HTTP API
- 알고리즘
- 양꼬치
- Servlet
- 2589
- 설탕 배달
- 서블릿
- 2839
- 맛집 투어
- BFS
- 백준
- mvc
- 2638
- 스프링
- 스프링 MVC
- Spring
- 문자열 압축
- 포두부 보쌈
- 프로그래머스
- 완도산회
- dp
- 1로 만들기
- 다이나믹 프로그래밍
- 동적 프로그래밍
- 쓰레드 풀
- 호유동
- 맛집
- 투어
- Today
- Total
프로그래밍 공방
[프로그래머스] 추석 트래픽 본문
문제
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 |
코드에 대한 피드백이나 더 좋은 아이디어는 언제나 환영입니다.
'개발 > 문제해결' 카테고리의 다른 글
[백준] 20058번 : 마법사 상어와 파이어스톰 (0) | 2020.11.22 |
---|---|
[프로그래머스] 다리를 지나는 트럭 (0) | 2020.11.22 |
[백준] 11722번 : 가장 긴 감소하는 부분 수열 (0) | 2020.11.21 |
[백준] 9436번 : Round Robin (0) | 2020.11.21 |
[백준] 11057번 : 오르막 수 (0) | 2020.11.18 |