🧫 문제 분석
✔️ 출처
📖 문제
시간 문제
콘이 셔틀을 타되 최대한 늦게 탈 수 있도록 하면된다.
같은 시각대에 타면 해당 시각대의 맨 마지막에 타게되는 점을 조심하면 된다.
각 회차별 시간대에 따라 탈 수 있는 인원들을 태우고
현재 셔틀에 탄 인원이 다 같은 시각이면 (해당 시각 - 1분) 에 타고
시각이 다 다르면 (제일 늦은 시각의 -1분)에 타면 된다.
🔅 문제 풀이
import java.util.*;
class Solution {
// 도착 시간중 제일 늦은 시각
//같은 시각에 도착한 크루 중 대기열에서 제일 뒤
// 23:59분 전까지
public String solution(int n, int t, int m, String[] timetable) {
StringBuilder sb = new StringBuilder();
int answer = 0;
// 시간순으로 정렬
int[] time = new int[timetable.length];
for (int i = 0; i < time.length; i++) {
String[] tmp = timetable[i].split(":");
time[i] = Integer.parseInt(tmp[0]) * 60 + Integer.parseInt(tmp[1]);
}
Arrays.sort(time);
// 9시 시작
int start = 9 * 60;
int end = 23 * 60 + 59;
int idx = 0;
// n회만큼 셔틀 운행
for (int i = 0; i < n; i++) {
TreeSet<Integer> ts = new TreeSet<>();
int cnt = 0;
// 현재 운행 버스의 출발시간안에 도착한 크루들 인원 카운트
while (idx < time.length && start >= time[idx]) {
if (cnt == m) break;
ts.add(time[idx]);
cnt++;
idx++;
}
// 버스에 다 탔지만 막차였다면
if (cnt == m && i == n - 1) {
// 동시 시간대 한 사람만 있다면
if (ts.size() == 1) {
answer = ts.pollFirst() - 1; // 1분먼저 나와서 탄다.
} else {
answer = ts.pollLast() - 1; // 시간집합 마지막 시간에서 1분 먼저 나온다.
}
sb.append(String.format("%02d:%02d", (answer/60), (answer%60)));
break;
}
// 막차인데 버스에 자리가 남는다면
if (cnt < m && i == n - 1) {
sb.append(String.format("%02d:%02d", (start/60), (start%60)));
break;
}
// 다음 차 시간으로 이동
start += t;
}
return sb.toString();
}
}
🔅 리팩토링
❗ 오답노트 / 필요한 지식
1. 처음에 ts.poll()을 2번했는데 잘못생각했다. 최대한 늦게 타야하는데 왜 이렇게 시도했는지 이유를 모르겠다.
'programmers > Kakao' 카테고리의 다른 글
| 길 찾기 게임 [자바] (0) | 2025.10.29 |
|---|---|
| 보석 쇼핑 [자바] (1) | 2025.10.16 |
| 다단계 칫솔판매 [자바] (0) | 2025.10.13 |
| K진수에서 소수개수 구하기 (0) | 2025.09.30 |
| 양국대회 [자바] (0) | 2025.09.28 |