티스토리 뷰

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

 

🐢 설명

버스를 타기위한 시간을 구하는 문제이다.

 

가장 늦게까지 늦잠을 자서 회사에 가기 위해 막차를 타야하는데, 동시간대에 도착한 경우 마지막에 줄을 서게 된다. 이때 버스에는 정원이 존재하므로 인원수 체크가 필요하다.

 

먼저 시간대별로 들어오는 시간순으로 뽑기위해 크루들을 큐에 넣는다. 이후 n번, t분 간격으로 m명이 탈 수 있는 버스가 오는데 여기에 탈 수 있는 경우 태운다.

 

우리에게 중요한건 "마지막 버스 시간"과 "마지막 버스에 탑승한 마지막 승객의 도착시간"이다. 어짜피 가장 늦게 가는게 목표이므로 이때만 알면 된다. 그렇게 위에서 전부 태워서 위에서 필요한 걸 얻는다.

 

이때,

  • 마지막 버스에 탑승한 승객의 수가 m명의 정원보다 적다면 가장 늦게 가도 탈 수 있으므로 마지막 버스 도착 시간에 간다. 
  • 마지막 버스에 탑승한 승객의 수가 m명의 정원보다 같거나 많다면, 일분이라도 더 빨리가야 앞줄에 설 수 있으므로 "마지막 버스에 탑승한 마지막 승객의 도착시간 - 1"에 간다.

 

🐢코드
import java.util.*;
/*
셔틀은 09:00부터 총 n회 t분 간격으로 역에 도착하며, 하나의 셔틀에는 최대 m명의 승객이 탈 수 있다.
*/

class Solution {
    PriorityQueue<Integer> pq = new PriorityQueue<>();
    
    public String solution(int n, int t, int m, String[] timetable) {
        
        for (String time : timetable) {
            String[] hhmmStr = time.split(":");
            int hhmm = Integer.parseInt(hhmmStr[0]) * 60 + Integer.parseInt(hhmmStr[1]);
            pq.add(hhmm);
        }
        
        int nowBussArriveTime = 540;
        int lastKrewTime = 0;
        int boardingCount = 0;
        int myBoardingTime = 0;
        
        for (int i = 0; i < n; i++) {
            boardingCount = 0;
            
            while (!pq.isEmpty() && pq.peek() <= nowBussArriveTime) {
                boardingCount++;
                lastKrewTime = pq.poll();
                if (boardingCount == m)
                    break;
            }
            nowBussArriveTime += t;
        }
        
        // 다탐 일찍가야댐
        if (boardingCount == m) {
            myBoardingTime = lastKrewTime - 1;
        } else {
            myBoardingTime = nowBussArriveTime - t;
        }
        
        return (
            String.format("%02d", myBoardingTime / 60)
            + ":"
            + String.format("%02d", myBoardingTime % 60));
    }
}
🐢 마무리
반응형
Comments
반응형
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday