gurwhddl
코알못 공부블로그
gurwhddl
전체 방문자
오늘
어제
  • 분류 전체보기
    • CSS
    • JS
    • node.JS
    • REACT
    • 코딩테스트 연습

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
gurwhddl

코알못 공부블로그

JS

프로그래머스 - 셔틀버스 JS

2023. 6. 30. 15:24

문제

카카오에서는 무료 셔틀버스를 운행하기 때문에 판교역에서 편하게 사무실로 올 수 있다. 카카오의 직원은 서로를 '크루'라고 부르는데, 아침마다 많은 크루들이 이 셔틀을 이용하여 출근한다.

이 문제에서는 편의를 위해 셔틀은 다음과 같은 규칙으로 운행한다고 가정하자.
셔틀은 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
    'JS' 카테고리의 다른 글
    • 프로그래머스 - 인사고과 JS
    • 프로그래머스 - 큰 수 만들기 JS
    • 다크모드 감지해서 적용하는 법
    • 비동기 2탄 - Promise
    gurwhddl
    gurwhddl

    티스토리툴바