자료구조 공부/String

[프로그래머스] 셔틀버스

kdhoooon 2021. 5. 23. 13:29

문제


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

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

  • 셔틀은 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