프로그래머스 - 셔틀버스
알고리즘/프로그래머스

프로그래머스 - 셔틀버스

https://programmers.co.kr/learn/courses/30/lessons/17678#

 

코딩테스트 연습 - [1차] 셔틀버스

10 60 45 ["23:59","23:59", "23:59", "23:59", "23:59", "23:59", "23:59", "23:59", "23:59", "23:59", "23:59", "23:59", "23:59", "23:59", "23:59", "23:59"] "18:00"

programmers.co.kr

1. 유형

구현

 

2. 시뮬레이션

로직

  1. timetable을 모두 "분"으로 전환 후, 오름차순 정렬
  2. 버스에 m명까지 태우기
    1. 만약 m명 미만이다. 현재 버스시간이 정답
    2. m명이다. 마지막에 탄 사람의 시간-1이 정답
  3. 분 -> 시

3. 코드

import java.util.*;
class Solution {
    public String solution(int n, int t, int m, String[] timetable) {
        String answer = "";
        int temps[] = hourToMin(timetable);
        Queue<Integer> Q = new LinkedList<>();
        for(int temp: temps) 
            Q.add(temp);
        int curtime = 9*60;
        int buscnt=1;
        int ret = 0;
        while(true){
            Queue<Integer> person = takeOn(Q, m, curtime);
            if(buscnt == n){
                if(person.size() == m){
                    while(!person.isEmpty()){
                        ret = person.poll();
                    }
                    ret -= 1;
                }else
                    ret = curtime;
                break;
            }
            buscnt++;
            curtime+=t;
        }
        answer = minToHour(ret);
        return answer;
    }
    static String minToHour(int time){
        String hour = String.valueOf(time/60);
        String min = String.valueOf(time%60);
        String ret = "";
        ret += hour.length()==1 ? (("0"+hour)+":"): (hour+":");
        ret += min.length()==1 ? ("0"+min): min;
        return ret;
    }
    static int[] hourToMin(String[] timetable){
        int[] temp = new int[timetable.length];
        int index = 0;
        for(String time: timetable){
            String times[] = time.split(":");
            int hour = stoi(times[0]);
            int min = stoi(times[1]);
            int sum = (hour*60) + (min);
            temp[index++] = sum;
        }
        Arrays.sort(temp);
        return temp;
    }
    static Queue<Integer> takeOn(Queue<Integer> Q, int m, int curtime){
        Queue<Integer> person = new LinkedList<>();
        while(!Q.isEmpty()){
            if(Q.peek() <= curtime){
                person.add(Q.poll());
            }else{
                break;
            }
            if(person.size() == m) break;
        }
        return person;
    }
    static int stoi(String s){
        return Integer.valueOf(s);
    }
}