문제
카카오에서는 무료 셔틀버스를 운행하기 때문에 판교역에서 편하게 사무실로 올 수 있다. 카카오의 직원은 서로를 '크루'라고 부르는데, 아침마다 많은 크루들이 이 셔틀을 이용하여 출근한다.
이 문제에서는 편의를 위해 셔틀은 다음과 같은 규칙으로 운행한다고 가정하자.
셔틀은 09:00부터 총 n회 t분 간격으로 역에 도착하며, 하나의 셔틀에는 최대 m명의 승객이 탈 수 있다.
셔틀은 도착했을 때 도착한 순간에 대기열에 선 크루까지 포함해서 대기 순서대로 태우고 바로 출발한다. 예를 들어 09:00에 도착한 셔틀은 자리가 있다면 09:00에 줄을 선 크루도 탈 수 있다.
일찍 나와서 셔틀을 기다리는 것이 귀찮았던 콘은, 일주일간의 집요한 관찰 끝에 어떤 크루가 몇 시에 셔틀 대기열에 도착하는지 알아냈다. 콘이 셔틀을 타고 사무실로 갈 수 있는 도착 시각 중 제일 늦은 시각을 구하여라.
단, 콘은 게으르기 때문에 같은 시각에 도착한 크루 중 대기열에서 제일 뒤에 선다. 또한, 모든 크루는 잠을 자야 하므로 23:59에 집에 돌아간다. 따라서 어떤 크루도 다음날 셔틀을 타는 일은 없다.
접근법
콘이 셔틀을 타고 사무실로 갈 수 있는 도착 시각 중 제일 늦은 시각 이라고 어렵게 표현하고 있지만 간단하게 생각하면
- 각 셔틀버스의 마지막 출발시간(막차시간)에 딱 맞춰서 타고 가는 게 가장 늦게 타고 가는 방법
- 하지만 무조건 막차시간에 탈 수 있는 건 아님
n t m table answer 2 10 2 [09:10,09:09,08:00] 09:09 이 케이스를 보면 알 수 있는데 - 이 셔틀의 경우 09시에 한번 , 09:10분에 한번 운행함
- 09시 - 타고 갈 수 있는 사람은 08:00 한명밖에 없음 (당연히 09시 이전에 와야 09시 버스를 탈 수 있음)
- 09시 10분(막차) - 09시 09분 , 09시 10분 두명이 남아있고 m=2이기 때문에 내가 타기 위해서는 09시 09분에 와야 함
- 막차시간에 탈 수 있는 사람들이 m명 이상이라면, 이 사람들 중에서 가장 늦게 도착한 사람보다 -1분 더 빨리 와야 탈 수 있음
코드
function solution(n, t, m, timetable) {
timetable = timetable.map((time) => time.split(':')).map(([hour,minute]) =>
parseInt(hour)*60 + parseInt(minute)).sort((a,b) => a - b)
let idx =0
let shuttleArrival = 540
//마지막 셔틀 전까지
for(let 반복=0;반복<n-1;반복++){
let passenger = 0
while(idx<timetable.length){
if(timetable[idx] <= shuttleArrival && passenger<m){
idx++
passenger++
}else{
break
}
}
shuttleArrival += t
}
//마지막 셔틀
let 내가탈시간 = shuttleArrival
let passenger = 0
for(let i=idx;i<timetable.length;i++){
console.log(timetable[i],shuttleArrival)
if(timetable[i] <= shuttleArrival){
passenger += 1
}
if(passenger === m){
내가탈시간 = timetable[i] - 1
break
}
}
const hour = Math.floor(내가탈시간 / 60)
const minute = 내가탈시간 % 60
return `${String(hour).padStart(2,0)}:${String(minute).padStart(2,0)}`
}
- 일단 단위를 분으로 통일하고, 오름차순으로 정렬
- 반복문을 통해 셔틀 시간별로 몇명이 탑승할 수 있는지를 구함
- 첫차 ~ 막차시간 - t시간 을 먼저 구해서, 미리 막차 전에 탑승한 사람들을 구함
- 막차 시간에는 탑승자가 m명이 되는 순간 내가 탈 시간을 그 탑승자 시간 -1로 변경하면서 반복문 종료
'JS' 카테고리의 다른 글
프로그래머스 - 인사고과 JS (0) | 2023.07.13 |
---|---|
프로그래머스 - 큰 수 만들기 JS (0) | 2023.07.12 |
다크모드 감지해서 적용하는 법 (0) | 2023.06.09 |
비동기 2탄 - Promise (0) | 2023.03.22 |
비동기 작업에서 콜백 함수의 역할 (0) | 2023.03.22 |