https://school.programmers.co.kr/learn/courses/30/lessons/17678
프로그래머스
SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
이 문제는 주어진 버스 스케줄과 대기자 명단을 기반으로
마지막 버스를 타기 위해 가장 늦게 도착해야 하는 시간을 계산한다.
먼저 timetable을 분 단위로 변환해 list에 저장하고,
이를 오름차순으로 정렬한다.
첫 번째 버스는 540분(09:00)부터 시작해 t분 간격으로 총 n번 운행하며,
각 버스는 최대 m명의 승객을 태울 수 있다.
반복문을 통해 각 버스의 출발 시간을 계산하며
대기자의 도착 시간이 버스 시간 이하인 경우 태울 수 있는지 확인한다.
마지막 버스의 경우, 자리가 남아 있다면 버스 시간에 맞춰 도착하면 되고,
자리가 없으면 마지막으로 태운 승객보다 1분 빨리 도착해야 한다.
최종적으로 계산된 시간을 시:분 형식으로 변환해 반환한다.
import java.util.*;
class Solution {
private ArrayList<Integer> list;
public String solution(int n, int t, int m, String[] timetable) {
int cnt = 0;
list = new ArrayList<>();
for (String time : timetable) {
String[] split = time.split(":");
int hour = Integer.parseInt(split[0]);
int minute = Integer.parseInt(split[1]);
list.add(hour * 60 + minute);
}
Collections.sort(list);
int index = 0;
int answer = 540+(n-1)*t;
for(int i = 0 ; i < n ; i++){
int busTime = 540 + (i * t);
int capacity = m;
while(list.size() > index && capacity > 0 && list.get(index) <= busTime){
index++;
capacity--;
}
if(i == n - 1){
if (capacity > 0) {
answer = busTime;
} else {
answer = list.get(index - 1) - 1;
}
}
}
int hour = answer / 60;
int min = answer % 60;
return String.format("%02d:%02d",hour,min);
}
}
'Algorithm & Data Structures > Programers' 카테고리의 다른 글
Lv 3. 거스름돈 (0) | 2024.12.02 |
---|---|
Lv 3. 다단계 칫솔 판매 (0) | 2024.11.28 |
Lv 3. 가장 긴 펠린드롬 (3) | 2024.11.21 |
Lv 3. 부대복귀 (0) | 2024.11.19 |
Lv 3. 경주로 건설 (1) | 2024.11.13 |