Algorithm, kakao2018 셔틀버스(17678)
어려웠던점
- 예제 2번을 이해하는데 어려웠다
- simpledateformat, calender 클래스를 처음 써봐서 헷갈렸다
풀이
- 셔틀이 오는 시간에 탑승 가능한 최대 탑승객을 태운다
- 마지막 탑승객을 태우고 빈자리가 있다면 해당시간에 콘은 탑승하면 된다
- 마지막 탑승객을 태우고 빈자리가 없다면 마지막 탑승객 보다 1분 이전에 탑승하면 된다
전체코드
package org.programmers;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;
public class kakao_2018_shuttle_17678 {
public String solution(int n, int t, int m, String[] timetable) {
String answer = "";
// 크루들이 온 시간순으로 정리
Arrays.sort(timetable);
int nowHour = 9, nowMin = 0;
int lastIn = 0, idx = 0;
String stringH="09" ,stringM="00" ;
while (n > 0) {
stringH = nowHour<10 ? "0"+nowHour : ""+nowHour;
stringM= nowMin < 10 ? "0"+nowMin : ""+nowMin;
// 셔틀버스의 최대 탑승객수까지만 태운다
for (int i=0; i<m; i++) {
// 당일 탑승할 모든 크루가 탑승했으면 끝난다
if(idx >= timetable.length)
break;
// 현재 시각 셔틀버스 이전에 온 크루인지 검사
if( (stringH+":"+stringM).compareTo(timetable[idx]) >= 0) {
idx++;
// 마지막에 탄 크루 수를 계산한다
if(n==1) lastIn++;
}
}
// 다음 셔틀버스 오는 시간
--n;
nowMin += t;
if (nowMin >= 60) {
nowHour += 1;
nowMin -= 60;
}
}
// 마지막 셔틀에 탑승한 크루 수가 최대보다 작으면 빈자리가 있으므로 마지막에 온다
if (lastIn < m)
answer = stringH+":"+stringM;
// 마지막 셔틀에 빈자리가 없으면 마지막 크루보다 1분 일찍온다
else {
SimpleDateFormat dateformat = new SimpleDateFormat("HH:mm");
Calendar cal = Calendar.getInstance();
try {
cal.setTime(dateformat.parse(timetable[idx-1]));
cal.add(Calendar.MINUTE, -1);
answer = dateformat.format(cal.getTime());
} catch (ParseException e) {
e.printStackTrace();
}
}
return answer;
}
}
Reference