본문 바로가기

알고리즘/Lv. 3

프로그래머스 17678 셔틀버스 자바스크립트 풀이

728x90

난이도 : Lv. 3

풀이일 : 2501212

https://school.programmers.co.kr/learn/courses/30/lessons/17678

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr


문제


아이디어

  • 전체 버스 시간을 숫자로 변환해서 쉽게 비교하자
  • 각 버스 시간에 버스를 타고 간 크루의 인덱스를 저장하자
  • 막차에 자리가 있다면, 막차 시간에 도착하자
  • 막차에 자리가 없다면 마지막 사람보다 1분 먼저 도착하자

코드

function solution(n, t, m, timetable) {
    var answer = ''
    var bus = 0, crew = 0, num = 0, now = 540 - t
    var lastseat = true
    
    // 크루 도착 정보 숫자 변환 및 정렬
    timetable = timetable.map((time) => {
        time = parseInt(time.substr(0, 2)) * 60 + parseInt(time.substr(3, 5))
        return time
    })
    
    timetable.sort((a, b) => a - b)
    
    while (bus < n) { // 각 버스에 타는 크루 살펴보기
        now += t
        num = 0
        while (crew + num < timetable.length && num < m) {
            if (timetable[crew + num] > now) { // 버스보다 늦은 사람 발견
                break
            }
            num++
            if (bus + 1 == n && num == m) { // 막차에 자리 없음
                lastseat = false
            }
        }
        crew += num
        bus++
    }
    
    // 막차에 자리 있으면 막차, 아니면 제일 마지막 사람 도착 시간 1분 전
    answer = lastseat ? now : timetable[crew - 1] - 1

    return parseInt(answer / 60).toString().padStart(2, "0") + ":" + (answer % 60).toString().padStart(2, "0")
}
  • lastseat : 막차에 자리가 있는지 확인
  • timetables : 모두 숫자로 변환해 9시인 540부터 각 셔틀버스 도착시간과 비교한다. 비교를 위한 정렬 필요
  • while (bus < n)  : 각 버스에 타는 크루를 구해 탄 크루의 인덱스를 crew로 저장
  • if (timetable[crew + num] > now) : 현재 버스 출발 시간보다 도착시간이 늦은 사람을 발견했으므로 중단 조건
  • 막차면서, 탈 수 있는 사람이 다 탔으면 막차에 자리가 없다.
  • 막차에 자리가 있다면 막차 시간 출력, 없다면 마지막 사람보다 1분 빨리 도착

제출 결과

 


느낀점

  • 같은 로직인데 속도는 파이썬 < 자바스크립트 < 자바 순이어서 신기하다. 항상 자스가 제일 느렸는데 아직 익숙하지 않아서 어떻게 코드를 짜야 빨라지는지 잘 모르겠다.
  • 문자와 숫자 변환, 문자열 자르기 등 자스에서 몰랐던 것들을 찾아가며 풀었다.