알고리즘 문제 풀기

프로그래머스: [1차]셔틀버스 - javascript(센스있는 구현)

Fo_rdang 2024. 5. 12. 20:09
반응형

문제 출처 

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

문제 풀이 힌트 

1) 주어진 timetable의 시간들을 분으로 나타내고, 오름차순 정렬하자.

2) 버스가 n회 오니까 반복문을 n만큼 돌린다. 

- 현재 시간 9:00 를 540으로 계산한다. 

- 현재 시간 540보다 일찍 온 크루들이 몇명인지 센다.(canRide) 

     - 만약 이 크루들이 m명보다 많을 때?

      => timetable에서 0부터 m만큼만 제거한다. 

    - 만약 이 크루들이 m명보다 적거나 같을 때?

      => timetable에서 0부터 canRide의 수만큼만 제거한다. 

    - 현재시간에서 += t 해준다. (다음 i 의 반복문에서의 버스 시간인것임.)

- 이 버스가 막차일 때 

  -  탈 크루들이 탈 수 있는 사람이(빨리 왔다는 뜻) 제한된 m보다 클 때

     => 크루들 배열에서 m-1 에 있는, 즉, 마지막에 탈 수 있었던 크루보다 야비하게 1분 빨리 가자. ㅋㅋ)  return 야비한 시간 

  -  모든 크루가 넉넉하게 다 탈 수 있을 때 

     => 그대로 return time 하면 됨 (버스 온 시간에 가도 탈 수 있으니까.)

정답 풀이 코드 

function solution(n, t, m, timetable) {

//현재 timetable의 시간들을 분으로 계산한 걸로 바꾸자. 
  timetable = timetable.map(a => {
      const [hour, min] = a.split(":"); 
      return (hour*60) + Number(min)
  })
  //오름차순 정렬하자. 
    timetable.sort((a,b) => a-b)
    
    let time = 9*60; //현재 시간 9:00도 분으로 나타내자 
    
    //버스가 n회 오니까, 그때 버스 시간과 크루들의 timetable을 비교하는 함수다. 
    for(let i=1; i<=n; i++){
        const canRide = timetable.filter(a => a<= time).length;  //만약 해당 버스 시간보다 빨리 오는 크루들의 수가 제한
        if(i === n){ //막차라는 뜻
            if(canRide >= m){ 
                time = timetable[m-1]-1
            }
        }else{ //아직 막차 아님. 
            timetable.splice(0, canRide > m ? m : canRide); //timetable에서  탈 수 있는 크루는 지워나갈 것이다. (탈 수 있는 사람이 m보다 크면, m까지 지우고 /// 탈 수 있는 사람보다 m이 크면, 탈 수 있는 사람 idx 까지 지워주면됨)
            time += t //다음 버스는 현재 시간에다가 t를 더한 값이다. (t는 버스 배차 간격)
        }
    }
    //우리는 시간을 분으로 계산한 상태이다. "540"이걸 다시 "09:00" 으로 바꿔야 한다. 
    //540을 60으로 나눈 몫은 시가 되고, 540을 60으로 나눈 나머지는 분이 된다. 
    //그리고 padStart를 이용해서 "9"시를 => "09" 이런식으로 바꿔준다. 
    return String(Math.floor(time/60)).padStart(2,'0')+':'+String(Math.floor(time%60)).padStart(2,'0')
}

 

Only 풀이 코드 

function solution(n, t, m, timetable) {
  timetable = timetable.map(a => {
      const [hour, min] = a.split(":"); 
      return (hour*60) + Number(min)
  })
    timetable.sort((a,b) => a-b)
    let time = 9*60; 
    for(let i=1; i<=n; i++){
        const canRide = timetable.filter(a => a<= time).length; 
        if(i === n){
            if(canRide >= m){
                time = timetable[m-1]-1
            }
        }else{
            timetable.splice(0, canRide > m ? m : canRide); 
            time += t
        }
    }
    return String(Math.floor(time/60)).padStart(2,'0')+':'+String(Math.floor(time%60)).padStart(2,'0')
}

 

알고가는 ppoint

- String.padStart(2,'0')

- 시간을 비교할 때 분으로 계산하기 

- 분으로 나타낸 시간을 다시 시와 분으로 나눌 때 '/60' '%60'을 이용하기 

 

반응형