> 문제
2018 카카오 블라인드 채용 문제
문제 : [셔틀버스]
문제풀이
PriorityQueue 사용하여 풀었습니다.
“HH:MM” 형식을 “MM”으로 치환하여 풀이하였으며, 설명은 소스의 주석과 같습니다.
파라미터값이 순서대로 2,10,3,[“09:05”,”09:09”,”09:13”] 의 결과는 “09:10”와 같으나,
“09:12”일때도 테스트케이스를 모두 통과할 수 있었으며, 테스트케이스를 추가해야하는 필요성이 있어보였습니다.
다음소스는 위의 추가 테스트케이스도 함께 통과할 수 있습니다.
import java.util.*;
public class Solution_셔틀버스 {
public static void main(String[] args) {
System.out.println(solution(2,10,3,new String[] {"09:05","09:09","09:13"}));
}
static public String solution(int n, int t, int m, String[] timetable) {
Queue<Integer> pq = new PriorityQueue<>(new Comparator<Integer>(){
@Override
public int compare(Integer o1, Integer o2){
return o1-o2;
}
});
String[] input = null;
for(int i=0; i<timetable.length; i++){
input = timetable[i].split(":");
int now = 60*Integer.parseInt(input[0]) + Integer.parseInt(input[1]); // 시간:분 => 분으로 치환
pq.add(now); // 짧은 시간 오름차순으로 저장
}
int start = 540; // 9시 => 540분 치환
int lastTime = 540+((n-1)*t); // 마지막 셔틀버스 도착 시간
for(int i=start; i<lastTime; i+=t){ // 마지막 이전까지 셔틀버스로
for(int j=0; j<m; j++){ // 출발할 수 있는 크루 삭제
if(!pq.isEmpty() && pq.peek() <= i) pq.poll();
}
}
int time = 0;
if(pq.size() < m || pq.isEmpty()) time = lastTime; // 1. 마지막 셔틀버스에 자리가 비었거나, 크루가 없을 때
else if(pq.peek() > lastTime) time = lastTime; // 2. 도착시간이 마지막 셔틀버스 도착시간보다 늦을 때
else { // 이때, 남은 크루인원은 정원보다 같거나 많다
int space = m; // 3. 크루와 도착시간 경쟁해야 할 때
for(int i=0; i<m; i++) {
if(space == 1) {
if(pq.peek() <= lastTime) time = pq.peek()-1;
else time = lastTime;
}
if(pq.peek() <= lastTime) {
space --;
pq.poll();
}
}
}
String hour = time/60 < 10 ? "0"+time/60 : time/60+"";
String minute = time%60 < 10 ? "0"+time%60 : time%60+"";
String answer = hour+":"+minute;
return answer;
}
}
문제 출처 : Programmers
PREVIOUS[프로그래머스] Level3 - 등굣길