반응형
문제 출처
https://school.programmers.co.kr/learn/courses/30/lessons/17678
문제 풀이 힌트
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'을 이용하기
반응형
'알고리즘 문제 풀기' 카테고리의 다른 글
프로그래머스: 표 편집 - javascript(양방향 연결리스트) (0) | 2024.05.21 |
---|---|
프로그래머스: 합승 택시 요금 - javascript(플로이드 와샬 알고리즘) (0) | 2024.05.14 |
프로그래머스: 다단계 칫솔 판매 - javascript(구현 및 dfs) (0) | 2024.05.12 |
프로그래머스: 징검다리 건너기 - javascript(이분탐색) (0) | 2024.05.08 |
프로그래머스: 보석 쇼핑 - javascript(슬라이딩 윈도우) (0) | 2024.05.07 |