본문 바로가기

알고리즘/Lv. 3

프로그래머스 17678 셔틀버스 자바 풀이

728x90

난이도 : Lv. 3

풀이일 : 2501201

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

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr


문제


아이디어

  • 전체 버스 시간을 숫자로 변환해서 쉽게 비교하자
  • 각 버스 시간에 버스를 타고 간 크루의 인덱스를 저장하자
  • 막차에 자리가 있다면, 막차 시간에 도착하자
  • 막차에 자리가 없다면 마지막 사람보다 1분 먼저 도착하자

코드

import java.util.Arrays;

class Solution {
    public String solution(int n, int t, int m, String[] timetable) {
        int bus = 0, crew = 0, num = 0, now = 540 - t;
        boolean lastseat = true;
        int[] crews = new int[timetable.length];
        
        // 크루 도착 정보 숫자 변환 및 정렬
        for (int i = 0; i < timetable.length; i++) {
            crews[i] = Integer.parseInt(timetable[i].substring(0, 2)) * 60 + Integer.parseInt(timetable[i].substring(3, 5));
        }
        Arrays.sort(crews);
        
        while (bus < n) { // 각 버스에 타는 크루 구하기
            now += t;
            num = 0;
            while (crew + num < crews.length && num < m) {
                if (crews[crew + num] > now) { // 현재 버스 도착 시간보다 늦게 온 사람 발견 -> 반복 중단
                    break;
                }
                num++;
                if (bus + 1 == n && num == m) { // 막차에 자리 없음
                    lastseat = false;
                }
            }
            crew += num;
            bus++;
        }
        
        // 막차에 자리가 있다면 막차, 없다면 막차 탄 마지막 사람의 도착 시간 1분 전
        int result = lastseat ? now : crews[crew - 1] - 1;
        
        return String.format("%02d", result / 60) + ":" + String.format("%02d", result % 60);
    }
}
  • lastseat : 막차에 자리가 있는지 확인
  • crews : 모두 숫자로 변환해 9시인 540부터 각 셔틀버스 도착시간과 비교한다. 비교를 위한 정렬 필요
  • while (bus < n)  : 각 버스에 타는 크루를 구해 탄 크루의 인덱스를 crew로 저장
  • if (timetable[crew + num] > now) : 현재 버스 출발 시간보다 도착시간이 늦은 사람을 발견했으므로 중단 조건
  • 막차면서, 탈 수 있는 사람이 다 탔으면 막차에 자리가 없다.
  • 막차에 자리가 있다면 막차 시간 출력, 없다면 마지막 사람보다 1분 빨리 도착

제출 결과


느낀점

  • 파이썬이랑 비교해서 왜이렇게 느리지 내가 뭔가 이상하게 코드를 짰나보다. 수정해봐야지