문제
카카오에서는 무료 셔틀버스를 운행하기 때문에 판교역에서 편하게 사무실로 올 수 있다. 카카오의 직원은 서로를 '크루'라고 부르는데, 아침마다 많은 크루들이 이 셔틀을 이용하여 출근한다.
이 문제에서는 편의를 위해 셔틀은 다음과 같은 규칙으로 운행한다고 가정하자.
- 셔틀은 09:00부터 총 n회 t분 간격으로 역에 도착하며, 하나의 셔틀에는 최대 m명의 승객이 탈 수 있다.
- 셔틀은 도착했을 때 도착한 순간에 대기열에 선 크루까지 포함해서 대기 순서대로 태우고 바로 출발한다. 예를 들어 09:00에 도착한 셔틀은 자리가 있다면 09:00에 줄을 선 크루도 탈 수 있다.
일찍 나와서 셔틀을 기다리는 것이 귀찮았던 콘은, 일주일간의 집요한 관찰 끝에 어떤 크루가 몇 시에 셔틀 대기열에 도착하는지 알아냈다. 콘이 셔틀을 타고 사무실로 갈 수 있는 도착 시각 중 제일 늦은 시각을 구하여라.
단, 콘은 게으르기 때문에 같은 시각에 도착한 크루 중 대기열에서 제일 뒤에 선다. 또한, 모든 크루는 잠을 자야 하므로 23:59에 집에 돌아간다. 따라서 어떤 크루도 다음날 셔틀을 타는 일은 없다.
풀이
제일 늦은 시각에 사무실에 도착하려면 가장 마지막 버스를 타고 가야한다.
따라서 가장 마지막 버스를 탈 수 있는 시간에 줄을 서야한다.
버스의 시간을 배열을 통해 저장했다 시간은 분을 기준으로 정렬하였다 ex) 9시는 540분이다.
크루의 탑승 시간도 똑같은 방식으로 ":" 을 기준으로 나누어 주고 시 * 60 + 분 을 해주고 오름차순 정렬하였다.
우선 마지막 버스에 타야하는 가장 순서의 크루의 순서를 찾아야한다.
int con = 0;
int lastCrew = 0;
for(int i = 0 ; i < n - 1 ; i++){
int count = 0;
for(; lastCrew < timetable.length ; lastCrew++){
if(crewArr[lastCrew] > busTime[i]){
break;
}
else{
count++;
if(count == m){
lastCrew++;
break;
}
}
}
}
해당 버스에 탈수 있는 크루라면 count++ 을 해주어 m 명이 탑승 할 때 까지 세준다.
만약 count == m 이 되면 다음 버스를 타야하므로 lastCrew++ 을 해준뒤 break 해주어 버스의 인덱스를 증가시켜준다.
lastCrew의 위치의 크루는 마지막 버스를 탑승하는 인원이다.
이렇게 찾아진 순서에서 마지막 버스를 실제로 탑승 할 수 있는 크루의 수를 구해야한다.
for(int i = lastCrew; i < timetable.length ; i++){
if(busTime[n - 1] >= crewArr[i]){
count++;
if(count == m){
lastCrew = i;
break;
}
}
}
이렇게 구해진 버스에 탑승한 크루의 수가 m 보다 작으면 마지막 버스의 시간을 넣어주면 된다.
m 보다 크거나 같다면 가장 마지막에 탑승한 크루의 시간에서 1 을 빼준 시간을 넣어주면 된다.
<전체코드>
import java.util.*;
class Solution {
static int[] crewArr;
public String solution(int n, int t, int m, String[] timetable) {
String answer = "";
int[] busTime = new int[n];
busTime[0] = 9 * 60;
for(int i = 1 ; i < n ; i++){
busTime[i] = busTime[i - 1] + t;
}
crewArr = new int[timetable.length];
for(int i = 0 ; i < timetable.length ; i++){
String[] time = timetable[i].split(":");
crewArr[i] = Integer.parseInt(time[0]) * 60 + Integer.parseInt(time[1]);
}
Arrays.sort(crewArr);
int con = 0;
int lastCrew = 0;
for(int i = 0 ; i < n - 1 ; i++){
int count = 0;
for(; lastCrew < timetable.length ; lastCrew++){
if(crewArr[lastCrew] > busTime[i]){
break;
}
else{
count++;
if(count == m){
lastCrew++;
break;
}
}
}
}
int count = 0;
for(int i = lastCrew; i < timetable.length ; i++){
if(busTime[n - 1] >= crewArr[i]){
count++;
if(count == m){
lastCrew = i;
break;
}
}
}
if(count >= m){
con = crewArr[lastCrew] - 1;
}
else{
con = busTime[n - 1];
}
answer =toTime(con);
return answer;
}
static String toTime(int con) {
int hours = con / 60;
int minutes = con % 60;
return String.format("%02d:%02d", hours, minutes);
}
}
'자료구조 공부 > String' 카테고리의 다른 글
[프로그래머스] 순위검색 (0) | 2021.05.26 |
---|---|
[프로그래머스] 광고삽입** (0) | 2021.05.25 |
[프로그래머스] 추석트래픽 (0) | 2021.05.17 |
[프로그래머스] 불량사용자 (0) | 2021.05.11 |
[프로그래머스] 튜플 (0) | 2021.05.10 |