programmers/Kakao

셔틀버스 [자바]

Meluu_ 2025. 10. 23. 15:30

 

🧫 문제 분석

✔️ 출처

[1차] 셔틀버스 level 3

📖 문제

 

시간 문제

콘이 셔틀을 타되 최대한 늦게 탈 수 있도록 하면된다.

 

같은 시각대에 타면 해당 시각대의 맨 마지막에 타게되는 점을 조심하면 된다. 

 

각 회차별 시간대에 따라 탈 수 있는 인원들을 태우고

현재 셔틀에 탄 인원이 다 같은 시각이면 (해당 시각 - 1분) 에 타고

시각이 다 다르면 (제일 늦은 시각의 -1분)에 타면 된다. 

 

 


🔅 문제 풀이

import java.util.*;

class Solution {
    // 도착 시간중 제일 늦은 시각
    //같은 시각에 도착한 크루 중 대기열에서 제일 뒤
    // 23:59분 전까지 
    
    public String solution(int n, int t, int m, String[] timetable) {
        StringBuilder sb = new StringBuilder();
        int answer = 0;
        
        // 시간순으로 정렬
        int[] time = new int[timetable.length];
        
        for (int i = 0; i < time.length; i++) {
            String[] tmp = timetable[i].split(":");
            time[i] = Integer.parseInt(tmp[0]) * 60 + Integer.parseInt(tmp[1]);
        }
        Arrays.sort(time);
        
        // 9시 시작 
        int start = 9 * 60;
        int end = 23 * 60 + 59;
        int idx = 0;
        
        // n회만큼 셔틀 운행
        for (int i = 0; i < n; i++) {
            TreeSet<Integer> ts = new TreeSet<>();
            int cnt = 0;
            
            // 현재 운행 버스의 출발시간안에 도착한 크루들 인원 카운트
            while (idx < time.length && start >= time[idx]) {
                if (cnt == m) break;
                ts.add(time[idx]);
                cnt++;
                idx++;
            }
            
            // 버스에 다 탔지만 막차였다면 
            if (cnt == m && i == n - 1) {
                // 동시 시간대 한 사람만 있다면 
                if (ts.size() == 1) {
                    answer = ts.pollFirst() - 1; // 1분먼저 나와서 탄다. 
                } else {
                    answer = ts.pollLast() - 1; // 시간집합 마지막 시간에서 1분 먼저 나온다.
                }
                
                sb.append(String.format("%02d:%02d", (answer/60), (answer%60)));
                break;
            }
            
            // 막차인데 버스에 자리가 남는다면
            if (cnt < m && i == n - 1) {
                sb.append(String.format("%02d:%02d", (start/60), (start%60)));
                break;
            }
            
            // 다음 차 시간으로 이동
            start += t;
        }     
        
        
        return sb.toString();
    }
}

 

 

🔅 리팩토링

❗ 오답노트 / 필요한 지식

1. 처음에 ts.poll()을 2번했는데 잘못생각했다. 최대한 늦게 타야하는데 왜 이렇게 시도했는지 이유를 모르겠다. 

'programmers > Kakao' 카테고리의 다른 글

길 찾기 게임 [자바]  (0) 2025.10.29
보석 쇼핑 [자바]  (1) 2025.10.16
다단계 칫솔판매 [자바]  (0) 2025.10.13
K진수에서 소수개수 구하기  (0) 2025.09.30
양국대회 [자바]  (0) 2025.09.28