[1차] 셔틀버스 : https://programmers.co.kr/learn/courses/30/lessons/17678
꽤나 막막했던 문제였는데 마지막 버스를 탄다고 했을 때 마지막 버스의 상황과 마지막 크루의 시간에 대해서 조건을 잘 맞춘다면 해결법은 찾을수 있었다.
시간 변경과 마지막 버스 상황에 맞는 조건을 찾는게 핵심
인것같다.
예를 들어보자,
문제 풀이 순서는 아래와 같다.
List<List<Integer> takeBus
) 초기화import java.util.Arrays;
import java.util.List;
import java.util.ArrayList;
class Solution {
public String solution(int n, int t, int m, String[] timetable) {
//시간 변환
int[] convertTimeTable = convertTimeTable(timetable);
//오름차순 정렬
Arrays.sort(convertTimeTable);
//버스 탑승 상황 리스트
List<List<Integer>> takeBus = new ArrayList<>();
for(int i=0;i<n;i++){
takeBus.add(new ArrayList<>());
}
//크루 타임 테이블 index
int timeTableIndex = 0;
//버스 정류장 도착 시간
int arriveTime = 0;
//배차
for(int arrive =0;arrive<n;arrive++){
//현재 운행 버스의 도착 시간
arriveTime = 9*60+(t*arrive);
//버스의 탑승 가능 인원이 될때 까지
while(takeBus.get(arrive).size()<m){
//타임 테이블 index가 배열 범위를 벗어나면 종료
if(timeTableIndex>= convertTimeTable.length) break;
//타임 테이블은 오름차순으로 정렬되어있기 때문에 버스 도착 시간보다 늦으면 탈수없다.
if(convertTimeTable[timeTableIndex]>arriveTime) break;
//시간과 탑승 가능 인원의 조건을 만족하는 타임 테이블 저장
takeBus.get(arrive).add(convertTimeTable[timeTableIndex]);
timeTableIndex++;
}
}
String answer = "";
//마지막 배차의 버스
List<Integer> lastBus = takeBus.get(takeBus.size()-1);
//마지막 버스에 탑승 인원이 있다면
if(lastBus.size() != 0){
int lastCrewTime = lastBus.get(lastBus.size()-1);
//마지막 버스에 탑승 가능인원이 꽉 차있다면
if(lastBus.size() == m){
//가장 늦게온 크루보다 1분 일찍 도착한다.
answer = convertTimeToString(lastCrewTime-1);
}
//버스가 꽉 차있지 않다면 버스 도착 시간에 도착하면된다.
else{
answer = convertTimeToString(arriveTime);
}
}
//마지막 버스에 탑승인원이 없다면 버스 도착 시간에 도착하면된다.
else{
answer = convertTimeToString(arriveTime);
}
return answer;
}
//int시간을 string시간으로 변경 함수
String convertTimeToString(int time){
StringBuilder sb = new StringBuilder();
int h = time/60;
int m = time%60;
if(h<10) sb.append("0");
sb.append(h);
sb.append(":");
if(m<10) sb.append("0");
sb.append(m);
return sb.toString();
}
//timetable의 string 시간을 int 시간으로 변경
int[] convertTimeTable(String[] timetable){
int[] convertTimeTable = new int[timetable.length];
for(int t=0;t<timetable.length;t++){
String[] arr = timetable[t].split(":");
//시
int h = Integer.parseInt(arr[0])*60;
//분
int m = Integer.parseInt(arr[1]);
convertTimeTable[t] = h+m;
}
return convertTimeTable;
}
}
추석 트래픽 문제를 풀었을때 배운 시간 다루는 법이 도움이 된 문제이다.