하루에 한 문제
[프로그래머스 2018 KAKAO BLIND RECRUITMENT] 셔틀버스 -Java 본문
https://programmers.co.kr/learn/courses/30/lessons/17678
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분 더 빨리 도착하게 해주면 됩니다.
프로그래머스 문제는 시간다루는 문제가 많아서 백준보다 재밌는거 같습니다~
'알고리즘 > 프로그래머스' 카테고리의 다른 글
[프로그래머스] 최고의 집합 -Java (0) | 2021.01.11 |
---|---|
[프로그래머스 Summer/Winter Coding(~2018)] 방문길이 -Java (0) | 2021.01.10 |
[프로그래머스] 큰 수 만들기 -Java (1) | 2020.12.29 |
[프로그래머스 Summer/Winter Coding(~2018)] 숫자게임 -Java (0) | 2020.12.29 |
[프로그래머스] 멀리 뛰기 -Java (1) | 2020.12.29 |
Comments