알고리즘102 :: KAKAO_셔틀버스
몇번 읽고 문제가 잘 이해가 안되었습니다. ㅠ__ㅠ
그래서 몇 가지 검색해보다가 알게된 사실을 예제로 설명해 보겠습니다.
example1)
n=1, t=1, m=5, timetable=["08:00","08:01","08:02","08:03"]
셔틀은 09:00 부터 출발합니다. 셔틀은 1번 1분 간격으로 역에 도착하지만 한번에 5명을 태울 수 있으므로 08:00~08:03, (콘이 탈 시각 08:04) 모두 태울 수 있습니다. 따라서,
example2)
n=2, t=10, m=2, timetable=["09:10","09:09","08:00"]
마찬가지로 셔틀이 09:00 부터 출발하는것을 생각해보면 08:00 에 한명을 태웁니다. 셔틀이 총 2번 10분 간격으로 오기때문에 다음 올 셔틀은 09:10 입니다. 이때, 대기하고 있던 인원들의 각각의 시간은 09:09, 09:10 (정렬했을때) 이다. 만약, 이럴경우 콘은 탈 수 없게 됩니다. 왜냐하면 셔틀은 한번에 2명을 태울 수 있기 때문입니다. 따라서, 콘이 사무실에 도착하되 제일 늦은 시간은 09:10 도착한 사람보다 1분 일찍 빠른 09:09 가 되어야 합니다.
마지막 예제 example5) 를 보면
n=10, t=60, m=45, timetable=[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]
셔틀은 09:00부터 출발합니다. 최대 10번에 60분 간격으로 역에 도착하기 때문에 600분(=10시간) 이후에 마지막 셔틀이 오게 됩니다. 10시간 후에는 18:00가 됩니다.
for(int i=0; i<timetable.length; i++){
int hour = Integer.parseInt(timetable[i].substring(0,2)); //시간
int min = Integer.parseInt(timetable[i].substring(3,5)); //분
currentTime[i] = hour*60+min; //currentTime에 저장
}
Arrays.sort(currentTime); //빠른 순서대로 온 인원들을 우선적으로 앞으로 배정(대기시간)
int[] bus = new int[n];
for(int i=0; i<n; i++){
bus[i] = 540+t*i; //셔틀은 09:00 부터 출발하므로 분으로 환산하면 540, 배차 간격에 따라
+됩니다.
}
int[] waitOfPeople = new int[n]; //버스당 탈 수 있는 인원
int[][] waitOfPeopleTime = new int[n][m]; //버스당 탄 인원의 도착 시간
for(int i=0; i<currentTime.length; i++){
for(int j=0; j<n; j++){
if(currentTime[i]<=bus[j]){ //bus에 탑승하기 위해서는 현재 도착한 시간이 더 빨라야 합니다.
if(waitOfPeople[j]>=m){ //인원이 초과.
continue; //다음 버스에 인원을 태움
}
waitOfPeopleTime[j][waitOfPeople[j]] = currentTime[i];
//j번째 버스에 waitOfPeople[j] 인원의 currentTime[i] bus에 탑승하기 위해 도착한 시간
++waitOfPeople[j];
//버스에 탑승할 수 있으므로 한명 증가
break;
}
}
}
if(waitOfPeople[n-1]>=m){//마지막 버스에 탄 인원수가 넘친다면 마지막 인원이 탑승한 시간보다 1분더 일찍 오면 됩니다.
int hour = waitOfPeopleTime[n-1][m-1]/60; //마지막 버스에 마지막 인원의 버스를 기다리는 시간
int min = waitOfPeopleTime[n-1][m-1]%60; //마지막 버스에 마지막 인원의 버스를 기다리는 분
if(min-1<0){
answer = (hour-1>9 ? hour-1 : "0"+(hour-1))+":59";
//9보다 크면 10 이므로 앞에 0이오는 구조가 될 수 없음
//09:00 면 08:59 출력을 맞춰줘야 하기 때문에 59
}else{
answer = (hour>9 ? hour : "0"+hour)+":"+(min-1>9?min-1:"0"+(min-1));
//위와 마찬가지로 min-1>9보다 크면 그대로, 그렇지 않으면 앞에 0을 붙여줘야 함
}
}else{ //마지막 버스에 제일 마지막을 탑승하면 됀다.
answer = (bus[n-1]/60>9?bus[n-1]/60:"0"+bus[n-1]/60)+":"+(bus[n-1]%60>9?bus[n-1]%60:"0"+bus[n-1]%60);
//마지막 셔틀에 탑승하면 되기때문에 bus[n-1] : 마지막 버스에 탑승한 인원의 시간이 됩니다.
}
종합
import java.util.*;
class Solution {
public String solution(int n, int t, int m, String[] timetable) {
String answer = "";
int[] currentTime = new int[timetable.length];
for(int i=0; i<timetable.length; i++){
int hour = Integer.parseInt(timetable[i].substring(0,2));
int min = Integer.parseInt(timetable[i].substring(3,5));
currentTime[i] = hour*60+min;
}
Arrays.sort(currentTime);
int[] bus = new int[n];
for(int i=0; i<n; i++){
bus[i] = 540+t*i;
}
int[] waitOfPeople = new int[n]; //버스당 탈 수 있는 인원
int[][] waitOfPeopleTime = new int[n][m]; //버스당 탄 인원의 도착 시간
for(int i=0; i<currentTime.length; i++){
for(int j=0; j<n; j++){
if(currentTime[i]<=bus[j]){
if(waitOfPeople[j]>=m){ //인원이 초과되었다.
continue; //다음 버스에 인원을 태우자
}
waitOfPeopleTime[j][waitOfPeople[j]] = currentTime[i];
++waitOfPeople[j];
break;
}
}
}
if(waitOfPeople[n-1]>=m){//마지막 버스에 탄 인원수가 넘친다면 마지막 인원이 탑승한 시간보다 1분더 일찍 오면 됀다.
int hour = waitOfPeopleTime[n-1][m-1]/60; //마지막 버스에 마지막 인원의 버스를 기다리는 시간
int min = waitOfPeopleTime[n-1][m-1]%60; //마지막 버스에 마지막 인원의 버스를 기다리는 분
if(min-1<0){
answer = (hour-1>9 ? hour-1 : "0"+(hour-1))+":59";
}else{
answer = (hour>9 ? hour : "0"+hour)+":"+(min-1>9?min-1:"0"+(min-1));
}
}else{ //마지막 버스에 제일 마지막을 탑승하면 됀다.
answer = (bus[n-1]/60>9?bus[n-1]/60:"0"+bus[n-1]/60)+":"+(bus[n-1]%60>9?bus[n-1]%60:"0"+bus[n-1]%60);
}
return answer;
}
}
*reference: https://4ngs.tistory.com/27
감사합니다.
'알고리즘' 카테고리의 다른 글
알고리즘104 :: BOJ_1766_문제집 (0) | 2020.09.26 |
---|---|
알고리즘104 :: 최소 스패닝 트리(MST) (0) | 2020.09.24 |
알고리즘101 :: 프로그래머스 - 소수찾기 (0) | 2020.09.21 |
알고리즘 100 :: 백준 순열과 조합(N과M 시리즈) (0) | 2020.09.21 |
알고리즘 99 :: 2019 카카오 블라인드 코딩테스트 - 후보키 (0) | 2020.09.07 |
댓글
이 글 공유하기
다른 글
-
알고리즘104 :: BOJ_1766_문제집
알고리즘104 :: BOJ_1766_문제집
2020.09.26 -
알고리즘104 :: 최소 스패닝 트리(MST)
알고리즘104 :: 최소 스패닝 트리(MST)
2020.09.24 -
알고리즘101 :: 프로그래머스 - 소수찾기
알고리즘101 :: 프로그래머스 - 소수찾기
2020.09.21 -
알고리즘 100 :: 백준 순열과 조합(N과M 시리즈)
알고리즘 100 :: 백준 순열과 조합(N과M 시리즈)
2020.09.21