코딩 테스트/프로그래머스

프로그래머스 셔틀버스 문제 (자바)

 

크루들을 우선순위 큐에 전부 집어놓고 

버스 도착 시간마다 큐에서 버스에 탑승 가능한 인원만큼 빼고는 방법으로 계산하면 된다.

중요한점은 세가지 정도로

1 . 문자열의 시간을 숫자로 변경해서 계산하기 편하게 만들기

2. 마지막에 탑승한 사람 - 1분이 도착해야하는 사람임으로 탑승할때 마다 해당 값을 적용

3. 마지막 버스에 자리가 남는 경우는 해당 버스 도착 시간에 맞춰서 나가면 된다.

 

ps

처음에는 숫자를 문자로 변경할때 3항연산자 2개를 사용했는데 String.format() 메서드를 사용하면 편하다.

import java.util.ArrayList;
import java.util.List;
import java.util.PriorityQueue;

// 프로그래머스 셔틀버스 문제
class Solution {
    public String solution(int n, int t, int m, String[] timetable) {
        int answerTime = 0;
        int departTime = 9 * 60;
        List<List<Integer>> buses = new ArrayList<>();
        for (int i = 0 ; i < n; i++) {
            buses.add(new ArrayList<>());
        }

        PriorityQueue<Integer> crews = new PriorityQueue<>();
        for (String time : timetable) {
            StringConvertTime(time);
            crews.offer(StringConvertTime(time));
        }

        for (int i = 0; i < n; i++) {
            while (!crews.isEmpty()) {
                int crew = crews.poll();
                if (crew <= departTime && buses.get(i).size() < m) {
                    buses.get(i).add(crew);
                    answerTime = crew - 1;
                }else {
                    crews.offer(crew);
                    break;
                }
            }
            departTime += t;
        }

        if (buses.get(n - 1).size() < m) {
            answerTime = departTime - t;
        }
        return TimeConvertString(answerTime);
    }

    static int StringConvertTime(String s) {
        String[] split = s.split(":");
        int hour = Integer.parseInt(split[0]);
        int minute = Integer.parseInt(split[1]);
        return hour * 60 + minute;
    }

    static String TimeConvertString(int val) {
        String hStr = String.format("%02d", val / 60);
        String mStr = String.format("%02d", val % 60);
        return hStr +":"+mStr;
    }
}