알고리즘/프로그래머스

[프로그래머스] [1차] 셔틀버스 자바(Java) 풀이 및 해설

승민아 2024. 5. 22. 09:13

https://school.programmers.co.kr/learn/courses/30/lessons/17678

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

풀이 방법

버스가 도착할때 탑승 가능인원만큼 버스에 탑승한다.

사람들을 탑승 시키는 방법은

timetable을 오름차순으로 정렬하고

탑승 가능한 시각이라면 ( 버스 도착 시각보다 일찍 도착한 사람) 탑승 시킨다.

 

내가 가장 늦게 버스를 타는 방법은

막차 버스에 마지막 여석에 내가 타면 된다.

 

막차 버스에 대기중인 사람이 없다면

막차 버스 도착 시각에 탄다.

 

막차 버스에 대기중인 사람이 있다면

마지막 탑승 사람보다 1분 일찍 도착하면 된다.

 

전체 코드

import java.util.*;
class Solution {
    public String solution(int n, int t, int m, String[] timetable) {
        String answer = "";
    
        // 분으로 변환
        List<Integer> arrive = new ArrayList<Integer>();
        for(int i=0; i<timetable.length; i++) {
            int hour = Integer.parseInt(timetable[i].charAt(0) + "" + timetable[i].charAt(1));
            int min = Integer.parseInt(timetable[i].charAt(3) + "" + timetable[i].charAt(4));
            arrive.add((hour * 60) + min);
        }
        
        // 오름차순 정렬
        arrive.sort((o1, o2) -> {
            return o1 - o2;
        });
        
        // 버스 도착 시각
        int cur = 540; // 09:00
        while(n>0) {
            
            // 탑승 가능 자리
            int space = m;
            while(space>0) {
                
                // 막차이고 1자리 남았을때
                if(n==1 && space == 1) {
                    String hour, min;
                    if(arrive.size()==0) { // 대기열이 없다면 버스 도착 시각에 탐
                        hour = String.valueOf(cur / 60);
                        min = String.valueOf(cur % 60);
                    } else {
                        if(arrive.get(0) <= cur) { // 대기중인 사람이 탑승 가능한 버스라면
                            arrive.set(0, arrive.get(0)-1); // 대기중인 사람보다 1분 일찍
                            hour = String.valueOf(arrive.get(0) / 60);
                            min = String.valueOf(arrive.get(0) % 60);
                        } else { // 대기중인 사람이 탑승 불가능하면 내가 첫번째라 버스 도착 시각에 탐
                            hour = Integer.toString(cur / 60);
                            min = String.valueOf(cur % 60);
                        }
                    }
                    
                    if(hour.length() == 1) // 1자리인경우 앞에 "0" 추가
                        hour = "0" + hour;
                    if(min.length() == 1)
                        min = "0" + min;
                    answer = hour + ":" + min;
                    break;
                }
            
                // 현재 시각 버스에 탑승 가능한 인원이라면
                if(arrive.size()>0 && arrive.get(0) <= cur) {
                    arrive.remove(0);
                }
                space--;
            }

            
            cur += t; // 다음 버스 도착 시각
            n--;
        }
        
        
        return answer;
    }
}