알고리즘

[프로그래머스 LV2] 호텔 대실 JS

limew 2023. 10. 4. 15:22

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

 

 


 

문제요점

  • 10분청소 후 다음 사용가능
  • 필요한 최소객실수는?

 

풀이

  • 분으로 변환
  • 시작시각 오름차순
  • 각 방마다 입실 가능한 시각을 저장하는 배열 canEnterTimes을 시각 오름차순정리
  • 첫번째방 추가  (이때 10분의 청소시간도 플러스)
  • 다음 방부터 순회를 돌며
    • 들어 갈 수 있는 방이 없는 경우 (현재 예약의 입실 시각 < 가장 빠른 입실 가능한 시각)
      • 방추가
      • 현재 입실하는 방의 다음 입실 가능시각 canEnterTimes에 추가 (+ 10 청소시간)
      • canEnterTimes 가장 빨리 입실 가능한 시각 오름차순으로 갱신
    • 들어 갈 수 있는 방이 있는 경우 
      • canEnterTimes에서 첫번째 제거 (이전의 빨리 들어 갈 수 있는 방의에 현재의 고객이 들어감)
      • 현재 입실하는 방의 다음 입실 가능시각 canEnterTimes에 추가  (+ 10 청소시간)
      • canEnterTimes 가장 빨리 입실 가능한 시각 오름차순으로 갱신

 

// 10분청소 후 다음 사용가능
// 필요한 최소객실수는?
// 분으로 변환
// 시작시각 오름차순
// 각 방마다 입실 가능한 시각을 저장하는 배열 (오름차순)
function solution(book_time) {
    var answer = 0;
    const bookArr = book_time.map(book => {
        const convertToNum = book.map(b => {
            const [h, m] = b.split(':');
            return Number(h)*60+Number(m);
        })
        return {start: convertToNum[0], end: convertToNum[1]};
    }).sort((a, b) => a.start - b.start);
    
    const canEnterTimes = [bookArr[0].end+10]; // 각 방마다 입실가능한 시각
    answer++; // 첫번째방
    
    for (let i = 1; i < bookArr.length; ++i) {
        const {start, end} = bookArr[i];
        // 들어갈 수 있는 방이 없는 경우
        if (start < canEnterTimes[0]) {
            answer++; // 방추가
        } 
        // 들어갈 수 있는 방이 있는 경우
        else {
            canEnterTimes.shift(); // 이미 퇴실한 방 제거
        }
        canEnterTimes.push(end+10); // (새로운 방이나 기존 방에) 현재 입실하는 방의 다음 입실가능시각 추가
        canEnterTimes.sort((a, b) => a-b); // 가장 빠른 다음 입실시각 갱신
    }
    return answer;
}

 

 

느낀점

문제를 잘 읽자 10분의 청소시간

 

또다른 풀이

function solution(book_time) {
    var answer = 0;
    const bookArr = book_time.map(book => {
        const convertToNum = book.map(b => {
            const [h, m] = b.split(':');
            return Number(h)*60+Number(m);
        })
        return {start: convertToNum[0], end: convertToNum[1]};
    }).sort((a, b) => a.start - b.start);
    
    const canEnterTimes = [bookArr[0].end+10];
    answer++; // 첫번째방
    
    for (let i = 1; i < bookArr.length; ++i) {
        const {start, end} = bookArr[i];
        // 들어갈 수 있는 방 찾기
        let createRoom = true;
        for (let j = 0; j < canEnterTimes.length;j++) {
            // 방 찾음
            if (canEnterTimes[j] <= start) {
                canEnterTimes.splice(j, 1);
                canEnterTimes.push(end+10);
                createRoom = false;
                break;
            }
        }
        
        if (createRoom) {
            answer++;
            canEnterTimes.push(end+10);
        }
    }
    return answer;
}