문제 설명
셔틀버스
카카오에서는 무료 셔틀버스를 운행하기 때문에 판교역에서 편하게 사무실로 올 수 있다. 카카오의 직원은 서로를 '크루'라고 부르는데, 아침마다 많은 크루들이 이 셔틀을 이용하여 출근한다.
이 문제에서는 편의를 위해 셔틀은 다음과 같은 규칙으로 운행한다고 가정하자.
- 셔틀은 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" |
풀기 전에 생각한 것들
컬렉션 안에 타임테이블넣기
중복상관없고 키벨류값 아니니까 그냥 List로 하기로 하자
타임테이블을 받아서 어떻게 저장할것인가
split이용해서 ":"를 기준으로 좌 우 배열 나눈다음에
좌배열에 x60해주고 우배열을 더한 값을 컬렉션에 하나하나 넣기
메서드를 만들어도 좋을듯
메서드 생성
분단위로 하기로 했으니까 분단위로 바꿔줄 메서드와
마지막에 HH:MM형식으로 바꿔줄 메서드 생성
Solution메서드서는 그냥 메서드 호출해서 하면될듯
조건 정하기
1. 운행 횟수로 메인조건 세우기
2. 컬렉션이 0이될 때까지 돌리기
둘 중에는 a가 더 좋아보임
메인조건이 운행횟수가 되면 그냥 운행횟수만큼 돌아가는 큰 반복문을 버스가 왔을 때라고 가정하고
태울사람 태우고 출발했으면 다음 차가 오게 만들려면 540+t
컬렉션 안에있는 숫자들과 540과 비교해서 태울수 있으면 태우다가 m보다 태운사람수가 많아지려하면 조건 끝내면 됨
그러고 다음 차로왔을때 모든 조건 초기화될수있게 만들기
컬렉션 돌리는것도 초기화 할 필요가 없는게 결국 모든 컬렉션안에 들어있는 사람이 타면 콘이 탈 수 있기때문에 배열길이는 초기화 시킬 필요없음
마지막에 탄 사람 값을 저장 해놓고 버스 자리가 남으면 마지막에 탄 사람 값이 되는거고 자리가 없다면 그 사람들 보다 1분 일찍오면되니까 -1해주면 된다
import java.util.ArrayList;
import java.util.Collections;
public class Solution {
// n 운행횟수
// t 간격
// m 탈 수 있는 사람 수
String solution(int n, int t, int m, String[] timetable) {
String answer = "";
ArrayList<Integer> timeList = new ArrayList<>();
// timeList에 timetableInteger메서드를 활용
// timeList 컬렉션에 timetable[i]의 값을 분단위로 바꾼후 저장
for(int i=0; i<timetable.length; i++) {
timeList.add(timetableInteger(timetable[i]));
}
// 처음에 정렬을 안했더니 배열의 뒤쪽에 출발시간보다 일찍온 사람을 못걸러내준다
Collections.sort(timeList);
// 분으로 계산하기위한 설정값과 사람수cnt 컬렉션length설정
int start=540;
int cnt=0;
int length=0;
int lastManTime=0;
// 운행횟수 만큼 반복
for(int i=0; i<n; i++) {
// cnt는 m과 비교되야하기때문에 운행횟수 별로 초기화
cnt=0;
// 배열 전체를 다 끝내면 break되게 설정
if(length>=timeList.size()) {
break;
}
// 운행 횟수 별로 cnt가 더 커질때 break되게 cnt는 실제로 탄 사람 숫자 m은 탈 수 있는 사람 숫자
while(cnt<m) {
// 첫차보다 일찍 와 있는 사람이 있으면 배열 올리면서 확인
if(start>=timeList.get(length)) {
// 마지막으로 탄 사람 시간
lastManTime = timeList.get(length);
length++;
cnt++;
// 만약 배열안의 모든 사람이 일찍왔으면 계속 배열을 올릴테니까 그만두는 조건 만들어둠
if(length>=timeList.size()) {
break;
}
}
// 먼저 도착한 사람이 없을경우 어짜피 탈사람은 없으니까 다음 배차시간으로 넘어가게
else {
break;
}
}
// 다음 배차시간은 540+t일테니 설정
start+=t;
}
// 마지막 버스에 자리가 있다면 for문 마지막의 +t를 초기화시켜줘야하기 때문에 -t로 설정
if(cnt < m){
answer = integerToTimetable(start-t);
}
// 마지막 버스에 자리가 없음 -> 마지막으로 탄사람보다 1분 먼저 와야 함
else {
answer = integerToTimetable(lastManTime-1);
}
System.out.println(answer);
return answer;
}
// 타임테이블을 int로 바꿔줌
int timetableInteger(String tt){
// :를 기준으로 앞 뒤 배열로 나뉘어 저장된다
String[] ttArr = tt.split(":");
int hours = Integer.parseInt(ttArr[0])*60;
int minute = Integer.parseInt(ttArr[1]);
return hours+minute;
}
// 바꾼 int를 마지막에 타임테이블 형식으로
String integerToTimetable(int tt2) {
String hours = String.valueOf(tt2/60);
String minute = String.valueOf(tt2%60);
// 만약 시간이 9시일경우를 고려 HH형식으로 전환
if(hours.length()<2) {
hours = "0"+hours;
}
// 분 단위가 0~9일때를 위한 0 삽입해놈
if(minute.length()<2) {
minute = "0"+minute;
}
String answer = hours+":"+minute;
return answer;
}
}
2023.04 ~ 백엔드 개발자의 기록
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!