프로그래머스 [Kakao] 셔틀버스 (Java)

배인성·2022년 1월 24일
1

프로그래머스

목록 보기
21/55
post-thumbnail

링크

문제 링크

문제 설명

카카오에서는 무료 셔틀버스를 운행하기 때문에 판교역에서 편하게 사무실로 올 수 있다. 카카오의 직원은 서로를 '크루'라고 부르는데, 아침마다 많은 크루들이 이 셔틀을 이용하여 출근한다.

이 문제에서는 편의를 위해 셔틀은 다음과 같은 규칙으로 운행한다고 가정하자.

  • 셔틀은 09:00부터 총 n회 t분 간격으로 역에 도착하며, 하나의 셔틀에는 최대 m명의 승객이 탈 수 있다.
  • 셔틀은 도착했을 때 도착한 순간에 대기열에 선 크루까지 포함해서 대기 순서대로 태우고 바로 출발한다. 예를 들어 09:00에 도착한 셔틀은 자리가 있다면 09:00에 줄을 선 크루도 탈 수 있다.

일찍 나와서 셔틀을 기다리는 것이 귀찮았던 콘은, 일주일간의 집요한 관찰 끝에 어떤 크루가 몇 시에 셔틀 대기열에 도착하는지 알아냈다. 콘이 셔틀을 타고 사무실로 갈 수 있는 도착 시각 중 제일 늦은 시각을 구하여라.

단, 콘은 게으르기 때문에 같은 시각에 도착한 크루 중 대기열에서 제일 뒤에 선다. 또한, 모든 크루는 잠을 자야 하므로 23:59에 집에 돌아간다. 따라서 어떤 크루도 다음날 셔틀을 타는 일은 없다.

입력 형식

셔틀 운행 횟수 n, 셔틀 운행 간격 t, 한 셔틀에 탈 수 있는 최대 크루 수 m, 크루가 대기열에 도착하는 시각을 모은 배열 timetable이 입력으로 주어진다.

  • 0 < n ≦ 10
  • 0 < t ≦ 60
  • 0 < m ≦ 45
  • timetable은 최소 길이 1이고 최대 길이 2000인 배열로, 하루 동안 크루가 대기열에 도착하는 시각이 HH:MM 형식으로 이루어져 있다.
  • 크루의 도착 시각 HH:MM은 00:01에서 23:59 사이이다.

출력 형식

콘이 무사히 셔틀을 타고 사무실로 갈 수 있는 제일 늦은 도착 시각을 출력한다. 도착 시각은 HH:MM 형식이며, 00:00에서 23:59 사이의 값이 될 수 있다.

입출력 예

풀이

  1. 로직 구현할 때 온 순서대로 버스에 태울 생각이니까 timetable을 정렬하자.
  2. timetable을 정렬하고 미리 분 단위로 바꿔놓자! hour * 60 + min으로!! 그래야 int끼리 비교할 수 있어서 좋다!
  3. 어차피 주인공 콘은 제일 마지막에 탈 생각이니까 n을 줄여가면서 콘이 탑승할 시간 근처로 버스를 흘려보내자 (while문)
  4. 자리가 있으면 그냥 버스가 출발할 때 와서 타면 된다.
  5. 근데 자리가 없어서 누군가를 밀쳐내야하는 상황이라면 제일 마지막에 타는 사람보다 1분 일찍 와서 타면 된다.

예에엣날에 알고리즘 테스트를 준비하기 시작했을 때 이 문제를 보고 문제조차 이해못했었던 기억이 난다.

오늘 보는데 문제 이해가 잘 되길래 한번 풀어보았는데 마지막에 예외처리한다고 고생 많았다...

테케 3개말고 다 되는데 질문하기 에서 얻은 테스트케이스를 보고 아예 5번 과정의 로직을 수정했다.

저거 고치니까 한번에 통과!

코드

import java.util.*;
class Solution {
    public String to_str(int now) {
        String answer = "";
        if(now / 60 < 10) answer = "0";
        answer = answer + Integer.toString(now / 60) + ":";
        if(now % 60 < 10) answer = answer + "0";
        answer = answer + Integer.toString(now % 60);        
        return answer;
    }
    public String solution(int n, int t, int m, String[] timetable) {
        String answer = "";
        int[] crew = new int[timetable.length];
        int now = 9 * 60; //09:00이니까
        int Idx = 0, i;
        Arrays.sort(timetable);
        for(i = 0; i < timetable.length; i++){
            crew[i] = Integer.parseInt(timetable[i].substring(0,2)) * 60 + 
                Integer.parseInt(timetable[i].substring(3, 5));
        }
        while(n-- > 0) {
            for(i = 0; i < m && crew[Idx] <= now; i++,Idx++);
            now += t;
        }
        if(crew.length - Idx >= m) {
            for(i = 0; i < m && crew[Idx] <= now; i++, Idx++);
            if(i == m) { //자리 다 찼을때
                now = --crew[Idx - 1];
            }
        }
        answer = to_str(now);
        return answer;
    }
}
profile
부지런히 살자!!

0개의 댓글