반응형
단순 구현 문제이다.
단순 구현 문제이긴 하지만 조건들이 까다롭고 문제이해가 오래 걸려서 구현함에 있어 고생을 하였다. 이 문제를 품에 있어 시간을 60진수로 간주하고 int화 시켜서 문제를 접근하였다. 그리고 bus들을 map에 저장하여 남은 자리를들을 체크해주었고, 크루들을 한명씩 체크하며 버스의 마지막자리에 탈때의 시간, 그리고 남는 버스자리의 시간들을 비교하여 콘이 탈 시간의 최대값을 찾았다.
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
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
|
package programmers;
import java.util.Arrays;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Set;
import java.util.StringTokenizer;
public class Solution_2018카카오_셔틀버스 {
public static void main(String[] args) {
// int n=1; int t=2;int m=5;
// String[] timetable= {"08:00", "08:01", "08:02", "08:03"};
int n=2;int t=10;int m=2;
String[] timetable= {"09:10","09:09","08:00"};
// int n=2;int t=1;int m=2;
// String[] timetable= {"09:00","09:00","09:00","09:00"};
// int n=1;int t=1;int m=5;
// String[] timetable= {"00:01","00:01","00:01","00:01","00:01"};
// int n=1;int t=1;int m=1;
// String[] timetable= {"23:59"};
// int n=10;int t=60;int m=45;
// String[] timetable= {"23:59","23:59","23:59","23:59","23:59","23:59","23:59",
// "23:59","23:59","23:59","23:59","23:59"};
System.out.println(solution(n, t, m, timetable));
}
static String solution(int n, int t, int m, String[] timetable) {
String answer = "";
int[] crews=new int[timetable.length];
int index=0;
for(String time :timetable) {
crews[index++]=changeTimetoInt(time);
}
Arrays.sort(crews);
Map<Integer, Integer> bus=new LinkedHashMap<>();
int start=540; //09:00
//버스 배정
bus.put(start, m);
for(int i=0;i<n-1;i++) {
start+=t;
bus.put(start, m);
}
int cornTime=0; //콘이 탑승할시간
Set<Integer> keys = bus.keySet();
for(int crew:crews) {
int gap=Integer.MAX_VALUE; //시간차이
int pick=0; //선택한 버스
for(int key : keys) {
if(crew<=key && bus.get(key)>0) { //현재 crew가 탈수있는 버스이고, 버스에 자리가 있다면
if(key-crew < gap) { //가장가까운 버스탑승
pick=key;
gap=key-crew;
}
}
}
if(gap!=Integer.MAX_VALUE) { //선택한 버스가 있다면
bus.put(pick, bus.get(pick)-1);
if(bus.get(pick)==0 && crew-1 > cornTime) { //만일 버스에 자리가 더이상 없다면
cornTime=crew-1; //현재 crew보다 1분 먼저도착해야지 버스탑승가능
}
}
}
for(int key : keys) {
if(bus.get(key)>0 && key>cornTime) //만일 버스에 자리가 있다면
cornTime=key;
}
int hour=cornTime/60;
if(hour<10) {
answer+="0"+hour+":";
}else
answer+=hour+":";
int minute=cornTime%60;
if(minute<10) {
answer+="0"+minute;
}else
answer+=minute+"";
return answer;
}
static int changeTimetoInt(String time) {
StringTokenizer st=new StringTokenizer(time,":");
return Integer.parseInt(st.nextToken())*60 +Integer.parseInt(st.nextToken());
}
}
|
반응형
'Algorithm' 카테고리의 다른 글
[Programmers] 뉴스 클러스터링 (0) | 2020.05.21 |
---|---|
[Programmers] 프렌즈4블록 (0) | 2020.05.21 |
[BOJ] 2887. 행성 터널 (0) | 2020.05.17 |
[BOJ] 11660. 구간 합 구하기5 (0) | 2020.05.16 |
[BOJ] 10775. 공항 (0) | 2020.05.15 |