프로그래머스 - [1차] 셔틀버스

leehyunjon·2022년 4월 30일
0

Algorithm

목록 보기
16/162

[1차] 셔틀버스 : https://programmers.co.kr/learn/courses/30/lessons/17678


Problems




Solves

꽤나 막막했던 문제였는데 마지막 버스를 탄다고 했을 때 마지막 버스의 상황과 마지막 크루의 시간에 대해서 조건을 잘 맞춘다면 해결법은 찾을수 있었다.
시간 변경과 마지막 버스 상황에 맞는 조건을 찾는게 핵심인것같다.

예를 들어보자,

  • 1대의 버스가 운행하고 탑승가능 인원이 5명일때, 대기중인 크루가 5명이면 마지막 크루의 시간보다 1분 일찍오면된다.
  • 1대의 버스가 운행하고 탑승가능 인원이 5명일때, 대기중인 크루가 4명이면 버스 도착시간에 맞춰 오면 된다.

문제 풀이 순서는 아래와 같다.

  1. 버스의 배차 만큼 버스 리스트(List<List<Integer> takeBus) 초기화
  2. timetabled의 시간을 int로 변경 및 오름차순 정렬
    • 시 : timetable의 시간*60
    • 분 : timetable의 분
  3. 버스 배차(n) 만큼 반복 하면서 시간과 탑승가능 인원(m)을 고려하여 takeBus에 크루의 도착 시간 저장
  4. takeBus를 모두 갱신하고 난 뒤 마지막 버스의 상황에 따라 정류장 도착 시간을 정한다.

Code

import java.util.Arrays;
import java.util.List;
import java.util.ArrayList;
class Solution {
    public String solution(int n, int t, int m, String[] timetable) {
    	//시간 변환
        int[] convertTimeTable = convertTimeTable(timetable);
        //오름차순 정렬
        Arrays.sort(convertTimeTable);
        
        //버스 탑승 상황 리스트
        List<List<Integer>> takeBus = new ArrayList<>();
        for(int i=0;i<n;i++){
            takeBus.add(new ArrayList<>());
        }
        
        //크루 타임 테이블 index
        int timeTableIndex = 0;
        //버스 정류장 도착 시간
        int arriveTime = 0;
        //배차
        for(int arrive =0;arrive<n;arrive++){
        	//현재 운행 버스의 도착 시간
            arriveTime = 9*60+(t*arrive);
            
            //버스의 탑승 가능 인원이 될때 까지
            while(takeBus.get(arrive).size()<m){
            	//타임 테이블 index가 배열 범위를 벗어나면 종료
                if(timeTableIndex>= convertTimeTable.length) break;
                //타임 테이블은 오름차순으로 정렬되어있기 때문에 버스 도착 시간보다 늦으면 탈수없다.
                if(convertTimeTable[timeTableIndex]>arriveTime) break;
  
  				//시간과 탑승 가능 인원의 조건을 만족하는 타임 테이블 저장
                takeBus.get(arrive).add(convertTimeTable[timeTableIndex]);
                timeTableIndex++;
            }
        }
        
        String answer = "";
        //마지막 배차의 버스
        List<Integer> lastBus = takeBus.get(takeBus.size()-1);
    
    	//마지막 버스에 탑승 인원이 있다면
        if(lastBus.size() != 0){
            int lastCrewTime = lastBus.get(lastBus.size()-1);
            //마지막 버스에 탑승 가능인원이 꽉 차있다면
            if(lastBus.size() == m){
            	//가장 늦게온 크루보다 1분 일찍 도착한다.
                answer = convertTimeToString(lastCrewTime-1);
            }
            //버스가 꽉 차있지 않다면 버스 도착 시간에 도착하면된다.
            else{
                answer = convertTimeToString(arriveTime);
            }
        }
        //마지막 버스에 탑승인원이 없다면 버스 도착 시간에 도착하면된다.
        else{
            answer = convertTimeToString(arriveTime);
        }
        
        
        return answer;
    }
    
    //int시간을 string시간으로 변경 함수
    String convertTimeToString(int time){
        StringBuilder sb = new StringBuilder();
        int h = time/60;
        int m = time%60;
        
        if(h<10) sb.append("0");
        sb.append(h);
        sb.append(":");
        if(m<10) sb.append("0");
        sb.append(m);
        return sb.toString();
    }
    
    //timetable의 string 시간을 int 시간으로 변경
    int[] convertTimeTable(String[] timetable){
        int[] convertTimeTable = new int[timetable.length];
        for(int t=0;t<timetable.length;t++){
            String[] arr = timetable[t].split(":");
            //시
            int h = Integer.parseInt(arr[0])*60;
            //분
            int m = Integer.parseInt(arr[1]);
            convertTimeTable[t] = h+m;
        }
        return convertTimeTable;
    }
}

Result

추석 트래픽 문제를 풀었을때 배운 시간 다루는 법이 도움이 된 문제이다.

profile
내 꿈은 좋은 개발자

0개의 댓글