자기개발/프로그래머즈Lv3

[Programmers Lv3, Java] 1차 셔틀버스

KGW2027 2022. 11. 4. 11:09
728x90
반응형

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

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

  • 셔틀은 09:00부터 총 n회 t분 간격으로 역에 도착하며, 하나의 셔틀에는 최대 m명의 승객이 탈 수 있다.
  • 셔틀은 도착했을 때 도착한 순간에 대기열에 선 크루까지 포함해서 대기 순서대로 태우고 바로 출발한다. 예를 들어 09:00에 도착한 셔틀은 자리가 있다면 09:00에 줄을 선 크루도 탈 수 있다.

일찍 나와서 셔틀을 기다리는 것이 귀찮았던 콘은, 일주일간의 집요한 관찰 끝에 어떤 크루가 몇 시에 셔틀 대기열에 도착하는지 알아냈다. 콘이 셔틀을 타고 사무실로 갈 수 있는 도착 시각 중 제일 늦은 시각을 구하여라.

단, 콘은 게으르기 때문에 같은 시각에 도착한 크루 중 대기열에서 제일 뒤에 선다. 또한, 모든 크루는 잠을 자야 하므로 23:59에 집에 돌아간다. 따라서 어떤 크루도 다음날 셔틀을 타는 일은 없다.

입력 형식

셔틀 운행 횟수 n, 셔틀 운행 간격 t, 한 셔틀에 탈 수 있는 최대 크루 수 m, 크루가 대기열에 도착하는 시각을 모은 배열 timetable이 입력으로 주어진다.

  • 0 < n ≦ 10
  • 0 < t ≦ 60
  • 0 < m ≦ 45
  • timetable은 최소 길이 1이고 최대 길이 2000인 배열로, 하루 동안 크루가 대기열에 도착하는 시각이 HH:MM 형식으로 이루어져 있다.
  • 크루의 도착 시각 HH:MM은 00:01에서 23:59 사이이다.

 

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

 

프로그래머스

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

programmers.co.kr


심플하게 버스 탑승 크루들을 정렬한 뒤,

가장 마지막 버스에 빈 자리가 있다면, 버스 도착 시간에 도착해서 막차를 탑승하고,

마지막 버스에 빈자리가 없다면, 가장 늦게와서 버스에 탑승한 사람보다 1분 일찍와서 막차에  탑승하면 된다.

 

    public String solution(int n, int t, int m, String[] timetable) {

        Arrays.sort(timetable);

        int startTime = 9*60;
        int endTime = 23*60+59;

        String answer = "";

        int rodes = 0; // 총 탑승자 수
        for(int bus = 0 ; bus < n && startTime < endTime ; bus++) {

            // 1. 첫차부터 몇 명씩 태워서 출발하는지 계산한다.
            int thisBusRider = 0;
            for(int ridePerson = 0 ; ridePerson < m ; ridePerson++) {
                int checkNum = rodes+ridePerson;
                if(checkNum >= timetable.length) break;
                String[] split = timetable[checkNum].split(":");
                int compareTime = Integer.parseInt(split[0])*60 + Integer.parseInt(split[1]);
                if(startTime >= compareTime)
                    thisBusRider += 1;
            }
            rodes += thisBusRider;

            // 2. 막차인 경우 탑승을 테스트한다.
            if(bus == n-1) {
                int remainSit = m-thisBusRider;
                // 막차에 자리가 남아있다면, 버스가 도착하는 시간에 맞춰서 온다.
                if(remainSit > 0)
                {
                    answer = String.format("%02d:%02d", startTime/60, startTime%60);
                }
                // 자리가 없다면, 가장 늦게도착한 탑승자보다 1분 빨리온다.
                else
                {
                    String[] split = timetable[rodes-1].split(":");
                    int lastRider = Integer.parseInt(split[0]) * 60 + Integer.parseInt(split[1]);
                    answer = String.format("%02d:%02d", (lastRider-1)/60, (lastRider-1)%60);
                }
            }

            startTime+=t;
        }

        return answer;
    }

 

728x90
반응형