하루에 한 문제

[프로그래머스 2018 KAKAO BLIND RECRUITMENT] 셔틀버스 -Java 본문

알고리즘/프로그래머스

[프로그래머스 2018 KAKAO BLIND RECRUITMENT] 셔틀버스 -Java

dkwjdi 2021. 1. 3. 17:02

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

 

코딩테스트 연습 - [1차] 셔틀버스

10 60 45 [23:59,23:59, 23:59, 23:59, 23:59, 23:59, 23:59, 23:59, 23:59, 23:59, 23:59, 23:59, 23:59, 23:59, 23:59, 23:59] 18:00

programmers.co.kr

import java.text.ParseException;
import java.util.PriorityQueue;

class Solution {
		class Time implements Comparable<Time>{
			int hour,minute;
			public Time(int time) {
				this.hour = time/60;
				this.minute = time-(this.hour*60);
			}
			@Override
			public int compareTo(Time o) {
				if(this.hour==o.hour) return this.minute-o.minute;
				return this.hour-o.hour;
			}
			
		}
	    public String solution(int n, int t, int m, String[] timetable) throws ParseException {
	        Time answerTime=null;
	        
	        PriorityQueue<Time> timeList = new PriorityQueue<>();
	        
	        for(int i=0; i<timetable.length; i++) {
	        	String []time=timetable[i].split(":");
	        	if(540+(n*t)<Integer.parseInt(time[0])*60+Integer.parseInt(time[1])) continue;
	        	timeList.add(new Time(Integer.parseInt(time[0])*60+Integer.parseInt(time[1])));
	        }
	        
	        Time arriveTime=new Time(540);
	   loop:for(int i=0; i<n; i++) { //버스 몇 대 
	        	
	        	for(int j=0; j<m; j++) { // 사람 몇명 
	        		if(timeList.isEmpty()) {
	        			answerTime = new Time(arriveTime.hour*60+arriveTime.minute);
	        		}
	        		
	        		if(!timeList.isEmpty() &&i==n-1 && j==m-1) {
        				Time last=timeList.poll();
        				answerTime = new Time(last.hour*60+last.minute-1);
        				break loop;
        			}
	        		
	        		if(!timeList.isEmpty() &&isRide(timeList.peek(), arriveTime)) {
	        			
	        			timeList.poll();
	        			
	        		}
	        	}
	        	
	        	arriveTime=new Time(t+(arriveTime.hour*60)+arriveTime.minute);
	        	
	        }
	        StringBuilder sb= new StringBuilder();
	        if(answerTime.hour<10) sb.append("0"+answerTime.hour+":");
	        else sb.append(answerTime.hour+":");
	        if(answerTime.minute<10) sb.append("0"+answerTime.minute);
	        else sb.append(answerTime.minute);
	        
	        return sb.toString();
	    }
		private boolean isRide(Time peek, Time arriveTime) {
			if(peek.hour<arriveTime.hour ) return true;
			else if(peek.hour==arriveTime.hour) {
				if(peek.minute<=arriveTime.minute) return true;
			}
			
			return false;
		}
	}

소요시간 : 50분

 

셔틀버스라는 문제입니다!

 

처음에 시간을 어떻게 저장해서 다뤄야 할 지 고민을 많이 했습니다! 

고민하다가 클래스로 (시간*60+분) 을 받아서 시간, 분 을 따로 저장해주었습니다!

그리고 이친구들을 우선순위 큐에 넣어서 사용했습니다!

 

일단 PQ에 시간을 삽입할 때 마지막 버스보다 뒤에 도착하는 크루들은 PQ에 넣지 않았습니다.

 

그리고 나서는 2가지 상황이 발생합니다.

 

1. 마지막 버스에 자리가 남아서 마지막버스의 시간에 도착하면 탈 수 있는 경우

2. 마지막 버스에 자리가 없어서 못타는 경우

 

1-> 그냥 그 마지막 버스 시간을 리턴해주면 됩니다.

2-> 마지막에 타는 사람보다 1분 더 빨리 도착하게 해주면 됩니다.

 

프로그래머스 문제는 시간다루는 문제가 많아서 백준보다 재밌는거 같습니다~

Comments