혼자 힘으로 시간 내에 풀지 못 해서 결국 구글의 힘을 빌렸다...
currentBusIndex
)를 busCount
까지 한 대씩 증가시키면서crews
)에 있는 크루들을 maxCrewCountPerBus
만큼 차례대로 버스에 태운다.busArrival
시간 이전에 도착하여 대기한 크루만 버스에 태운다.corn
에 저장한다.corn
이 탑승할 수 있게 값을 조정한다.corn
이 마지막에 탑승한 크루보다 1분 먼저 도착하도록 한다.corn
이 버스 출발시각에 도착하도록 한다.import java.util.*;
class Solution {
private static final int TIME = 0;
private static final int MINUTE = 1;
private static final int TIME_UNIT = 60;
private static final int FIRST_BUS_TIME = 9 * TIME_UNIT;
private int busCount;
private int busInterval;
private int maxCrewCountPerBus;
private PriorityQueue<Integer> crews = new PriorityQueue<>();
public String solution(int n, int t, int m, String[] timetable) {
initParams(n, t, m, timetable);
int timeValue = findTheLatestInLineTime();
return parseTimeValueToString(timeValue);
}
private void initParams(int n, int t, int m, String[] timetable) {
busCount = n;
busInterval = t;
maxCrewCountPerBus = m;
parseTimetable(timetable);
}
private void parseTimetable(String[] timetable) {
for (String time : timetable)
crews.offer(parseTimeStringToValue(time));
}
private int parseTimeStringToValue(String timeStr) {
String[] result = timeStr.split(":");
return Integer.parseInt(result[TIME]) * TIME_UNIT + Integer.parseInt(result[MINUTE]);
}
private int findTheLatestInLineTime() {
int busArrival = FIRST_BUS_TIME;
int corn = FIRST_BUS_TIME;
for (int currentBusIndex = 0; currentBusIndex < busCount; currentBusIndex++) {
int crewOnBus = 0;
for (int i = 0; i < maxCrewCountPerBus; i++) {
if (!crews.isEmpty()) {
int nextCrew = crews.peek();
if (nextCrew <= busArrival) {
corn = crews.poll();
crewOnBus++;
}
}
if (currentBusIndex == busCount - 1) {
if (crewOnBus == maxCrewCountPerBus) corn--;
else if (crewOnBus < maxCrewCountPerBus) corn = busArrival;
}
}
busArrival += busInterval;
}
return corn;
}
private String parseTimeValueToString(int timeValue) {
StringBuilder sb = new StringBuilder();
if ((timeValue / TIME_UNIT < 10)) sb.append("0" + timeValue / TIME_UNIT);
else sb.append(timeValue / TIME_UNIT);
sb.append(":");
if ((timeValue % TIME_UNIT < 10)) sb.append("0" + timeValue % TIME_UNIT);
else sb.append(timeValue % TIME_UNIT);
return sb.toString();
}
}