js 프로그래머스 호텔대실

이명진·2023년 4월 11일
0

코드카타

목록 보기
65/69

문제 요약

호텔을 예약할때 방 수를 최소로 하고 싶다. 호텔은 체크아웃 뒤에 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분단위로 접근하다니 놀랍다. 나는 시간단위로 체크를 했다.

profile
프론트엔드 개발자 초보에서 고수까지!

0개의 댓글