본문 바로가기

Algorithm/코드 풀이

프로그래머스: 셔틀버스 [JAVA]

문제 링크

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. 만약 탑승한 사람이 있다면, 마지막 버스의 탑승한 인원 중 마지막 시간

 결국 앞선 2가지 조건을 구하기 위해 주어진 timetable을 정렬을 진행한 후, 반복문을 통해 순차적인 버스 시간대에 따라 해당 버스에 탑승하게 되는 인원을 인덱스 순서대로 제해간다. 그렇게 마지막 버스 시간대의 반복문에서, 현재 알고 있는 탑승객의 수, 그리고 timetable의 마지막 인덱스를 가지고 필요에 따라 2번 조건의 시간대를 구하여 다음과 같은 경우로 케이스를 나누어 답을 구하면 된다.

  1. 만약 버스의 탑승객 수에 여유가 있다면 버스 시간을 답으로
  2. 버스의 탑승객 수가 여유가 없다면 2번의 시간에서 1분을 뺀 시간을 답으로

 이 외에 알고리즘 상 String 형태의 시간을 더하고 빼는 경우가 많아 이를 계산하는 함수를 추가적으로 작성했다.

class Solution {
    public String solution(int n, int t, int m, String[] timetable) {
        String answer = "";
        Arrays.sort(timetable);
        int timetableIndex = 0;
        String busTime = calTime("09:00", -t);

        for (int i = 0; i < n; i++) {
            busTime = calTime(busTime, t);
            int passenger = 0;

            while (passenger < m //현재 총 탑승객이 수용 인원보다 적거나
                    && timetableIndex < timetable.length //timetable내에서
                    && timetable[timetableIndex].compareTo(busTime) <= 0) { //버스 타임보다 일찍이거나
                ++passenger;
                ++timetableIndex;
            }

            if (i == n - 1) { //마지막 버스라면
                if (passenger < m) {//버스에 모두 타고도 남는 상황
                    answer = busTime;
                } else {//버스에 다 못타는 상황에는 마지막 사람보다 1분 빠르게 도착
                    answer = calTime(timetable[timetableIndex - 1], -1);
                }
            }
        }

        return answer;
    }

    private String calTime(String time, int changeMinute) {
        String[] split = time.split(":");
        int hour = Integer.parseInt(split[0]), minute = Integer.parseInt(split[1]);
        String resultHour, resultMinute;

        minute += changeMinute;

        if (minute >= 60) {
            hour += 1;
            minute -= 60;
        } else if (minute < 0) {
            hour -= 1;
            minute += 60;
        }

        if (hour < 10) {
            resultHour = "0" + hour;
        } else {
            resultHour = hour + "";
        }

        if (minute < 10) {
            resultMinute = "0" + minute;
        } else {
            resultMinute = minute + "";
        }

        return resultHour + ":" + resultMinute;
    }
}

결과