잘못된 정보가 있다면, 꼭 댓글로 알려주세요(비로그인 익명도 가능).
여러분의 피드백이 저와 방문자 모두를 올바른 정보로 인도할 수 있습니다.
감사합니다. -현록
현록의 기록저장소
[Lv3] 셔틀버스 본문
programmers.co.kr/learn/courses/30/lessons/17678
문제 설명
셔틀버스
카카오에서는 무료 셔틀버스를 운행하기 때문에 판교역에서 편하게 사무실로 올 수 있다.
카카오의 직원은 서로를 '크루'라고 부르는데, 아침마다 많은 크루들이 이 셔틀을 이용하여 출근한다.
이 문제에서는 편의를 위해 셔틀은 다음과 같은 규칙으로 운행한다고 가정하자.
- 셔틀은 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 사이이다.
출력 형식
콘이 무사히 셔틀을 타고 사무실로 갈 수 있는 제일 늦은 도착 시각을 출력한다.
도착 시각은 HH:MM 형식이며, 00:00에서 23:59 사이의 값이 될 수 있다.
입출력 예제
n |
t |
m |
timetable |
answer |
1 |
1 |
5 |
["08:00", "08:01", "08:02", "08:03"] |
"09:00" |
2 |
10 |
2 |
["09:10", "09:09", "08:00"] |
"09:09" |
2 |
1 |
2 |
["09:00", "09:00", "09:00", "09:00"] |
"08:59" |
1 |
1 |
5 |
["00:01", "00:01", "00:01", "00:01", "00:01"] |
"00:00" |
1 |
1 |
1 |
["23:59"] |
"09:00" |
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" |
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
class Solution {
public int timestampToMinutes(String timestamp) {
int minute = (timestamp.charAt(3) - '0') * 10 + (timestamp.charAt(4) - '0');
int hour = (timestamp.charAt(0) - '0') * 10 + timestamp.charAt(1) - '0';
return hour * 60 + minute;
}
public String minutesToTimestamp(int minutes) {
int hour = minutes / 60;
int minute = minutes % 60;
return String.format("%02d:%02d", hour, minute);
}
public String solution(int n, int t, int m, String[] timetable) {
Comparator<String> comparator = new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
return timestampToMinutes(o1) - timestampToMinutes(o2);
}
};
Arrays.sort(timetable, comparator);
ArrayList<Integer>[] peoples = new ArrayList[n];
for (int i = 0; i < n; ++i) {
peoples[i] = new ArrayList<>(m);
}
int index = 0;
for (int i = 0; i < timetable.length; ++i) {
if (index >= n) {
break;
}
int pickMinutes = timestampToMinutes(timetable[i]);
int timeNow = 60 * 9 + t * index;
if (pickMinutes <= timeNow) {
if (peoples[index].size() < m) {
peoples[index].add(pickMinutes);
} else {
++index;
--i;
}
} else {
++index;
--i;
}
}
int[] ables = new int[n];
for (int i = 0; i < n; ++i) {
if (peoples[i].size() < m) {
ables[i] = 60 * 9 + t * i;
} else {
int able = -1;
int prev = 0;
for (int j = 0; j < peoples[i].size(); ++j) {
int now = peoples[i].get(j);
if (now > prev) {
able = now - 1;
}
prev = now;
}
ables[i] = able;
}
}
for (int i = n - 1; i >= 0; --i) {
if (ables[i] != -1) {
return minutesToTimestamp(ables[i]);
}
}
return null;
}
}
'Problem Solving > programmers' 카테고리의 다른 글
[Lv3] 추석 트래픽 (0) | 2021.04.21 |
---|---|
[Lv3] 순위 (0) | 2021.04.20 |
[Lv3] 입국심사 (0) | 2021.04.19 |
[Lv2] 뉴스 클러스터링 (0) | 2021.04.14 |
[Lv2] 튜플 (0) | 2021.04.14 |
잘못된 정보가 있다면, 꼭 댓글로 알려주세요(비로그인 익명도 가능).
여러분의 피드백이 저와 방문자 모두를 올바른 정보로 인도할 수 있습니다.
감사합니다. -현록