카카오에서는 무료 셔틀버스를 운행하기 때문에 판교역에서 편하게 사무실로 올 수 있다. 카카오의 직원은 서로를 '크루'라고 부르는데, 아침마다 많은 크루들이 이 셔틀을 이용하여 출근한다.
이 문제에서는 편의를 위해 셔틀은 다음과 같은 규칙으로 운행한다고 가정하자.
일찍 나와서 셔틀을 기다리는 것이 귀찮았던 콘은, 일주일간의 집요한 관찰 끝에 어떤 크루가 몇 시에 셔틀 대기열에 도착하는지 알아냈다. 콘이 셔틀을 타고 사무실로 갈 수 있는 도착 시각 중 제일 늦은 시각을 구하여라.
단, 콘은 게으르기 때문에 같은 시각에 도착한 크루 중 대기열에서 제일 뒤에 선다. 또한, 모든 크루는 잠을 자야 하므로 23:59에 집에 돌아간다. 따라서 어떤 크루도 다음날 셔틀을 타는 일은 없다.
셔틀 운행 횟수 n, 셔틀 운행 간격 t, 한 셔틀에 탈 수 있는 최대 크루 수 m, 크루가 대기열에 도착하는 시각을 모은 배열 timetable이 입력으로 주어진다.
콘이 무사히 셔틀을 타고 사무실로 갈 수 있는 제일 늦은 도착 시각을 출력한다. 도착 시각은 HH:MM 형식이며, 00:00에서 23:59 사이의 값이 될 수 있다.
예에엣날에 알고리즘 테스트를 준비하기 시작했을 때 이 문제를 보고 문제조차 이해못했었던 기억이 난다.
오늘 보는데 문제 이해가 잘 되길래 한번 풀어보았는데 마지막에 예외처리한다고 고생 많았다...
테케 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; } }