이번에 풀어본 문제는
프로그래머스 셔틀버스 입니다.
import java.util.*;
class Solution {
public String solution(int n, int t, int m, String[] timetable) {
Queue<Integer> pq = new PriorityQueue<>();
for (String time : timetable) {
String [] tmp = time.split(":");
int hour = Integer.parseInt(tmp[0]);
int min = Integer.parseInt(tmp[1]);
pq.add((hour * 60) + min);
}
int curTime = 9 * 60;
int m_count = 0;
int lastCrew = 0;
for (int i = 0; i < n; i ++) {
m_count = 0;
while (!pq.isEmpty() && pq.peek() <= curTime) {
m_count++; //한명 태우고
lastCrew = pq.poll(); // 마지막 탑승객의 시간 갱신
if (m_count == m) {
// 탑승객 꽉차면 다음 버스로
break;
}
}
// 다음 배차시간
curTime += t;
}
int answer = m_count == m ? lastCrew - 1 : curTime - t;
return timeToString(answer);
}
static String timeToString(int time) {
String hour = String.format("%02d", time / 60);
String min = String.format("%02d", time % 60);
return hour + ":" + min;
}
}
콘이 버스를 탈 수 있는 가장 늦은 시간을 출력하는 문제입니다.
결과를 구하기 위해 크게 두 가지 경우로 나눌 수 있습니다.
첫 번째 경우는, 마지막 n번째 버스가 도착했을 때, 해당 버스에 m만큼의 인원이 채워지지 못했다면 굳이 더 일찍 나갈 필요가 없기 때문에, 해당 버스 시간에 맞추어 나가면 됩니다.
두 번째 경우는, n번째 버스에 모든 인원이 다 태워진 경우입니다. 해당 경우에는, 버스에 탑승한 마지막 승객보다 1분 일찍 도착하면, 그 크루는 못타겠지만.. 콘은 마지막 승객이 될 수 있습니다.
위 두 가지 경우의 수를 고려하기 위해, 우선순위 큐를 활용하여 주어진 조건에 맞게 버스에 모든 탑승객을 태우고, 마지막 answer 변수에 두 경우를 비교하여 값을 담아주면 됩니다.
문제 내용이 재밌어서, 몰입하고 풀었던 것 같습니다 ㅎㅎㅎ 쉽지는 않았던 문제네요 ㅠ