호텔을 예약할때 방 수를 최소로 하고 싶다. 호텔은 체크아웃 뒤에 10분 청소 시간이 있고 그 이후에 손님을 받을수 있다.
손님의 예약 시간이 배열로 주어질때 최소 방 개수를 구하면된다.
요즘 2레벨을 풀고있는데 DFS문제가 계속 나와서 어려움을 느꼈는데 오래간만에 스스로 풀수 있는 문제가 나왔다.
function solution(book_time) {
let rooms = [];
book_time.sort()
book_time.forEach(t=>{
if(!rooms.length){
let outTime = setTime(t[1]) + 10;
outTime = check60(outTime)
rooms.push(outTime)
}else{
let inTime = setTime(t[0]);
let minTime = rooms.filter(x=>inTime-x>=0);
if(!minTime.length){
let outTime = setTime(t[1]) + 10;
outTime = check60(outTime)
rooms.push(outTime)
}else{
let mins = Math.min(...minTime);
let idx = rooms.indexOf(mins);
let outTime = setTime(t[1]) + 10;
outTime = check60(outTime)
rooms[idx] = outTime;
}
}
})
return rooms.length;
}
function setTime (time){
let [h,m] = time.split(':');
return Number(h+m)
}
function check60(num){
let h = num/100;
let m = h%1;
m = Number(m.toFixed(2))
if(m>=0.6){
h = h+1-0.6
return (h)*100
}
return num
}
일단 체크인시간으로 정렬 부터 시켜준다. 정렬이후에 룸 배열을 만들어서 체크아웃 시간을 구해서 시간을 판단해 예약을 넣어준다. 간단한 작업이지만 코드가 길게 나왔고 반복되는 로직이 있다.
let outTime = setTime(t[1]) + 10;
outTime = check60(outTime)
이부분을
let outTime = check60(setTime(t[1]) + 10)
한줄로 정리해준다.
조금 깔끔하게 정리했다.
function makeMinStamp(time) {
const [hour, min] = time.split(":").map(v => Number(v));
return hour * 60 + min;
}
function solution(book_time) {
const timeArr = Array.from({ length: makeMinStamp('23:59') + 10 }, () => 0);
book_time.forEach((time, i) => {
const [s, e] = time;
let start = makeMinStamp(s);
const end = makeMinStamp(e) + 9;
for (start; start <= end; start++) {
timeArr[start]++;
}
});
return Math.max(...timeArr);
}
간결한 식으로 풀었다. 확인해보니 1분 단위로 배열을 만들어서 예약을 체크하는 로직이었다.
시간 복잡도는 O(nm)이라고 한다.
챗 지피티에게 성능 측정을 물어보니 매개 변수 값이 작을때 괜찮지만 매개변수 값이 많을때는 성능이 안좋다고 말해주었다.
내코드와 비교했을때 가독성 및 간결하게 읽기는 좋지만 매개변수가 많을때 성능상 내 코드가 더 효과가 좋을것이라고 말해주었다.
그래도 이렇게 새로운 접근법에 대해 알아간다.
1분단위로 접근하다니 놀랍다. 나는 시간단위로 체크를 했다.