[프로그래머스] Level3 - 셔틀버스

 
by 박신종

> 문제

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