[2018 카카오 블라인드] 셔틀버스 (JAVA)

Jiwoo Kim·2021년 3월 10일
0
post-thumbnail

문제


풀이

혼자 힘으로 시간 내에 풀지 못 해서 결국 구글의 힘을 빌렸다...

  1. 버스(currentBusIndex)를 busCount까지 한 대씩 증가시키면서
  2. 대기열(crews)에 있는 크루들을 maxCrewCountPerBus만큼 차례대로 버스에 태운다.
    • busArrival 시간 이전에 도착하여 대기한 크루만 버스에 태운다.
    • 마지막에 탑승한 크루의 시간을 corn에 저장한다.
  3. 마지막 버스인 경우 corn이 탑승할 수 있게 값을 조정한다.
    a. 버스가 꽉 찬 경우 corn이 마지막에 탑승한 크루보다 1분 먼저 도착하도록 한다.
    b. 버스가 꽉 차지 않은 경우 corn이 버스 출발시각에 도착하도록 한다.

코드

import java.util.*;

class Solution {
    
    private static final int TIME = 0;
    private static final int MINUTE = 1;
    private static final int TIME_UNIT = 60;
    private static final int FIRST_BUS_TIME = 9 * TIME_UNIT;

    private int busCount;
    private int busInterval;
    private int maxCrewCountPerBus;
    private PriorityQueue<Integer> crews = new PriorityQueue<>();

    public String solution(int n, int t, int m, String[] timetable) {
        initParams(n, t, m, timetable);
        int timeValue = findTheLatestInLineTime();
        return parseTimeValueToString(timeValue);
    }

    private void initParams(int n, int t, int m, String[] timetable) {
        busCount = n;
        busInterval = t;
        maxCrewCountPerBus = m;
        parseTimetable(timetable);
    }

    private void parseTimetable(String[] timetable) {
        for (String time : timetable)
            crews.offer(parseTimeStringToValue(time));
    }

    private int parseTimeStringToValue(String timeStr) {
        String[] result = timeStr.split(":");
        return Integer.parseInt(result[TIME]) * TIME_UNIT + Integer.parseInt(result[MINUTE]);
    }

    private int findTheLatestInLineTime() {
        int busArrival = FIRST_BUS_TIME;
        int corn = FIRST_BUS_TIME;

        for (int currentBusIndex = 0; currentBusIndex < busCount; currentBusIndex++) {
            int crewOnBus = 0;
            for (int i = 0; i < maxCrewCountPerBus; i++) {
                if (!crews.isEmpty()) {
                    int nextCrew = crews.peek();
                    if (nextCrew <= busArrival) {
                        corn = crews.poll();
                        crewOnBus++;
                    }
                }
                if (currentBusIndex == busCount - 1) {
                    if (crewOnBus == maxCrewCountPerBus) corn--;
                    else if (crewOnBus < maxCrewCountPerBus) corn = busArrival;
                }
            }
            busArrival += busInterval;
        }
        return corn;
    }

    private String parseTimeValueToString(int timeValue) {
        StringBuilder sb = new StringBuilder();
        if ((timeValue / TIME_UNIT < 10)) sb.append("0" + timeValue / TIME_UNIT);
        else sb.append(timeValue / TIME_UNIT);
        sb.append(":");
        if ((timeValue % TIME_UNIT < 10)) sb.append("0" + timeValue % TIME_UNIT);
        else sb.append(timeValue % TIME_UNIT);
        return sb.toString();
    }
}

참고

[프로그래머스] [1차] 셔틀버스 (자바)

0개의 댓글