[프로그래머스] Lv3. 셔틀버스- JavaScript

이상돈·2023년 7월 25일
0
post-thumbnail

문제분류 : 코팅테스트 연습

난이도 : Level 3

출처 : 프로그래머스 - 셔틀버스

문제

제한사항

📌 내가 생각한 풀이

  1. timetable 오름차순 정렬
  2. bus의 start타임과 max인원을 담은 객체 생성
  3. 생성한 객체와 순차대로 timetable비교
    3.1 버스도착시간보다 기다리는 사람들의 시간이 더 작으면 timeIdx++
    3.2 버스도착시간보다 기다리는 사람들의 시간이 더 크면 그냥 보냄
  4. ⭐️마지막버스가 핵심!!
    4.1 마지막 버스중 기다리는 손님들을 다 태웠을때 자리가 남아있다면 마지막 버스
const minusTime = (str)=>{
    let result = "";
    let [hour, minute ] = str.split(':');
    minute = parseInt(minute)-1;
    hour = parseInt(hour);
    if(minute < 0){
        minute = minute+60;
        hour = hour-1;
        if(hour<10){
            hour = `0${hour}`
        }
        if(minute<10){
            minute = `0${minute}`
        }
        result = `${hour}:${minute}`
    }else{
        if(hour<10){
            hour = `0${hour}`
        }
        if(minute<10){
            minute = `0${minute}`
        }
        result = `${hour}:${minute}`
    }
    return result;
}

const compareTime = (str1, str2) =>{
    let a = parseInt(str1.replace(":",0));
    let b = parseInt(str2.replace(":",0));
    if(a >= b) return true;
    else return false;
}

const getTime = (str, dif) =>{
    let result = "";
    let [hour , minute] = str.split(':');
    
    hour = parseInt(hour)
    minute = parseInt(minute) + dif;
    if(minute >= 60){
        minute -= 60;
        hour+=1;
        if(hour<10){
            hour = `0${hour}`
        }
        if(minute<10){
            minute = `0${minute}`
        }
        result = `${hour}:${minute}`
    }else{
          if(hour<10){
            hour = `0${hour}`
        }
        if(minute<10){
            minute = `0${minute}`
        }
        result = `${hour}:${minute}`
    }
    return result
    
}
function solution(n, t, m, timetable) {
    var answer = '';
    let bus = [];
    let time = 0;
    let startTime = '09:00'
    for(var i =0; i<n; i++){
        bus.push({
            start: startTime,
            max : m
        })
        startTime = getTime(startTime, t);
    }
    timetable.sort((a,b)=>{
        return parseInt(a.replace(':',0)) - parseInt(b.replace(":",0))
    });
    let timeIdx = 0;
    let wait = [];
    for(var i =0; i<bus.length; i++){
        let val = bus[i];
        // 마지막 버스일 경우
        if(i === bus.length-1){
            let stack = []
            while(timeIdx < timetable.length && compareTime(val.start, timetable[timeIdx]) && val.max !== 0){
                stack.push(timetable[timeIdx]);
                timeIdx++;
                val.max-=1
            }
            // console.log(stack)
            if(val.max > 0){
                time = val.start
            }else{
                time = minusTime(stack.at(-1))
                
            }
            break;
        }
        while(timeIdx < timetable.length && compareTime(val.start, timetable[timeIdx]) && val.max !== 0){
            timeIdx++;
            val.max-=1;
            
        }
    }
    return (time)
}

📌 느낀점

주어진 조건을 천천히 따지고 마지막버스가 핵심인 것 만 조심하면 금방 풀린다!

profile
사람들의 더 나은 삶을 위한 개발자

0개의 댓글