문제
문제 설명
카카오에서는 무료 셔틀버스를 이용하여 판교역에서 사무실까지 이동할 수 있다고 합니다.
이 셔틀은 "09:00"부터 총 "n"회 "t"분 간격으로 역에 도착하며, 하나의 셔틀에는 최대 "m"명의 승객이 탈 수 있습니다.
셔틀은 도착했을 때 도착한 순간에 대기열에 있는 인원까지 포함해서 순서대로 태우고 출발합니다.
카카오 직원인 콘은 기다리는 시간을 아끼기 위해 어떤 인원이 몇 시에 셔틀 대기열에 도착하는지 알아내어 셔틀을 타고 사무실로 갈 수 있는 도착 시간 중 제일 늦은 시간을 구하고자 합니다.
단, 콘은 도착한 인원 중 제일 뒤에 줄을 스고, 모든 인원을 "23:59"에 집에 돌아가기 때문에 어떠한 인원도 다음날 셔틀을 타는 일은 없습니다.
※제한 사항
- 0 < n <= 10
- 0 < t <= 60
- 0 < m <= 45
- 1 <= timetalbe.lengh <= 2000이며 인원이 대기열에 도착하는 시각은 "HH:MM"형식으로 이루어져 있습니다.
- 인원의 도착 시각 "HH:MM"은 "00:01"에서 "23:59" 사이입니다.
풀이
문제에서 사무실로 도착할 수 있는 가장 늦은 시간을 구하고자한다 되어있습니다. 근데 timetable를 살펴보면 순서 상관없는 문자열로 값이 들어가 있는 걸 확인할 수 있습니다. 그렇기에 timetable에 있는 모든 값을 정수로 바꿔주었고, 오름차순으로 정렬해 다시 저장해 주었습니다.
그다음으로 가장 늦게 탈 수 있는 시간을 구해줘야 했는데 셔틀에 탈 수 있는 인원이 다 차지 않았더라도 그 시간에 도착하지 않은 인원은 셔틀에 탈 수 없기에 timetable에 있는 모든 인원의 시간을 비교하여 셔틀에 탈 인원과 타지 않을 인원을 구분해야 하는 작업이 필요하였습니다.
그렇기에 셔틀 운행 횟수인 n만큼 반복문을 돌려주었고 제일 처음 셔틀을 탈 수 있는 시간부터 시작해서 t분간 격으로 셔틀에 탈 수 있는 인원을 구분하여 timetable의 index를 조정해 주는 작업을 하였고 반복이 진행될 때마다 처음 셔틀 탑승 시각인 "09:00"값을 가진 변수 curTime에 t를 더해주는 작업을 하였습니다.
그리고 n번째 반복은 마지막 셔틀이므로 마지막 셔틀의 마지막 탑승인원인 timetable[m-1]에서 콘이 탑승할 수 있는 마지막 시간인 1분 빠른 시간 timetable[m-1] -1을 curTime에 저장해 주어 해당 값을 "HH:MM"형식으로 변환하여 반환해주었습니다.
풀이에 사용한 코드입니다.
function solution(n, t, m, timetable) {
var answer = ''; // 정답을 반환할 변수
var curTime = 540; // 현재 시간을 표현할 변수 초기 탑승 시각인 "09:00"저장
var count = 0; // 셔틀에 탑승할 인원을 저장하는 임시 변수
// timetable의 값을 분 단위로 바꿔주는 부분
timetable.map((data,index) => {
timetable[index] = (parseInt(data.split(":")[0]) * 60) + (parseInt(data.split(":")[1]))
})
// 오름차순으로 정렬
timetable.sort((a,b) => a-b)
// 셔틀 운행횟수인 n번만큼 반복
for(let i=1; i<=n; i++){
// 해당 시간에 탑승할 수 있는 인원 수를 계산
count = timetable.filter((data) => data <= curTime).length
// 막차일 시
if(i===n){
// count가 m 보다 작을 경우 초기 운행 시간 안에 모두 탑승 가능하므로
// 같거나 클 경우에만 curTime업데이트
if(count >= m){
curTime = timetable[m-1] - 1
}
}else{
// 막차가 아닐 시 탑승한 인원을 timetable에서 빼주는 작업
// 다음 셔틀을 위해 curTime에 t를 더해준다
timetable.splice(0,count > m ? m : count)
curTime += t
count = 0
}
}
// 분 단위로 되어있는 curTime값을 "HH:MM"형태로 변환
var hour = curTime/60 < 10 ? "0"+Math.floor(curTime/60) : Math.floor(curTime/60)
var min = curTime%60 < 10 ? "0"+Math.floor(curTime%60) : Math.floor(curTime%60)
answer = hour+":"+min
return answer;
}
'코딩테스트 > 프로그래머스' 카테고리의 다른 글
[프로그래머스] Lv.02 큰 수 만들기 (JavaScript) (1) | 2024.06.06 |
---|---|
[프로그래머스] Lv.02 스킬트리 (JavaScript) (1) | 2024.06.05 |
[프로그래머스] Lv.01 연습문제 대충 만든 자판 (JavaScript) (0) | 2024.05.17 |
[프로그래머스] Lv.01 연습문제 둘만의 암호 (JavaScript) (0) | 2024.05.14 |
[프로그래머스] Lv.01 연습문제 명예의 전당(1) (JavaScript) (0) | 2024.05.10 |