[프로그래머스] [1차] 셔틀버스

2020. 4. 28. 23:18프로그래머스/카카오

import java.util.*;

class Solution {
  public String solution(int n, int t, int m, String[] timetable) {
      String answer = "";
      int start = 540;
      
      PriorityQueue<Integer> pq = new PriorityQueue<>();
      
      for(int i=0; i<timetable.length; i++) {
          int time = caculateTime(timetable[i]);
          pq.offer(time);
      }
      
      for(int i=0; i<n; i++){
          if(i==n-1){
            if(pq.size()<m){
                String hour = formatTime(Integer.toString(start/60));
                String minute = formatTime(Integer.toString(start%60));
    
                answer = hour + ":" + minute;
                    
            }else{
                for(int j=0; j<m-1; j++){
                    pq.poll();
                }
                
                if(pq.peek()>start){
                    String hour = formatTime(Integer.toString(start/60));
                    String minute = formatTime(Integer.toString(start%60));
    
                answer = hour + ":" + minute;
                }else{
                String hour = formatTime(Integer.toString((pq.peek()-1)/60));
                String minute = formatTime(Integer.toString((pq.peek()-1)%60));
                
                answer = hour + ":" + minute;
                }
            }
              
          }
          else{
          for(int j=0; j<m; j++){
              if(pq.peek()<=start){
                  pq.poll();
              }else{
                  break;
              }
          }
          }
          
          start +=t;
      }
      
      return answer;
  }
    
  private int caculateTime(String time){
      int hour = Integer.parseInt(time.split(":")[0]);
      int minute = Integer.parseInt(time.split(":")[1]);
      return 60*hour + minute;
  }
 
  private String formatTime(String time) {
      if(time.length()!=2){
          return "0"+time;
      }
      return time;
  }
    
}

1. 가장작은 값을 계속해서 빼내야 하는 상황 >> 배열로 하면 for문으로 돌때 index설정에 문제가 발생함

따라서, PriorityQueue 를 사용하였다.

2. 시간을 가장 작은단위 즉, 문제에서는 분단위로 모두 바꾸어 계산하기 편하게 해주었다.

3. 가장 늦게타는 것이 목적이므로  n회차에 탑승하도록 한다.

4. n-1 회차까지는 보낼 수 있는 사람을 모두 보낸다. (  priorityqueue로부터 제거)

5-1 n번째일때, 남은사람이 탈 수 있는 총원 m보다 적으면 해당 버스가 출발할때에 맞추어 오면 된다.

5-2 n번째일때, 남은사람이 탈 수 있는 총원 m과 같거나 더 많으면 m번째보다 1분더 일찍와서 버스를 탄다. 

이때, m번째가 버스출발시간보다 더 늦게오면 버스출발시간에 맞춰서 오면 되고

버스출발시간보다 일찍올경우 그것보다 1분더 일찍와서 버스를 타도록 만든다.