Bin's Blog

[프로그래머스] Level2 - 호텔 대실(Javascript) 본문

Algorithm

[프로그래머스] Level2 - 호텔 대실(Javascript)

hotIce 2023. 6. 7. 19:18
728x90
 

프로그래머스

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

programmers.co.kr

▶️▶️ 문제 요약

1. 호텔을 운영 중인 코니는 최소한의 객실만을 사용하여 예약 손님들을 받으려고 한다.

2. 한 번 사용한 객실은 퇴실 시간을 기준으로 10분간 청소를 하고 다음 손님들이 사용할 수 있다.

3. 예약 시각이 문자열 형태로 담긴 2차원 배열 book_time이 매개 변수로 주어질 때 코니에게 필요한 최소 객실의 수를 return 하는 solution 함수를 완성해라.

 

✅ 정답 코드

// 시간계산 함수
function timeCalculated(time) {
    let [hour, minute] = time.split(":").map(Number);
    return hour * 60 + minute;
}
function solution(book_time) {
    let queue = [];
    let times = [];
    

    for (let book of book_time) {
        // 시작, 끝시간을 나눈다.
        let [start, end] = book;
        // 시작시간 분으로 변환
        start = timeCalculated(start);
        // 끝시간 분으로 변환 
        end = timeCalculated(end) + 10;
        // 배열에 계산된 값을 담아준다.
        times.push([start, end]);
    }
    // 시작시간 정렬
    times.sort((a, b) => a[0] - b[0]);
    // 가장 최솟값의 종료시간을 큐에 담는다.
    queue.push(times[0][1]);
	
    // 가장 작은 값을 제외한 나머지 값을 본다.
    for (let i = 1; i < times.length; i++) {
        // 계속 최솟값을 찾기위해 정렬을 해준다.
        queue.sort((a, b) => a - b);
        // 큐의 최솟값을 찾는다.
        let min = Math.min(...queue);
        // 만약 다음 예약시간이 현재 종료시간보다 작으면 새로운 방이 필요하다
        if (times[i][0] < min) {
            queue.push(times[i][1]);
        // 만약 다음 예약시간이 현재 종료시간보다 크면 그 방을 이용할 수 있으니
        // 그 자리를 대체하기 위해서 최솟값을 빼주고 다음 방의 종료시간을 넣어준다.
        } else if (times[i][0] >= min) {
            queue.shift();
            queue.push(times[i][1])
        }
    }
    // 큐의 길이를 출력
    return queue.length;
    
}

📖 풀이 과정

1. 이 문제는 우선순위 큐를 사용해서 풀어야 하는 문제이다. 현재 방이 다음 손님이 이용할 수 있는지, 다음 대실 시작 시간이 현재 대실 종료 시각 보다 늦으면 그 방을 이용하고 아니면 새로운 방을 이용해야 한다. 

 

2. 분을 계산하는 함수를 하나 만들었다. 주어진 입력값(시간)을 비교해야 하기 위해서 1시간은 60분이니까 60을 곱해주고 나머지 분은 더해준다. 입력값이 "10:00" 이니까 split() 메서드를 이용해서 :을 기준으로 앞 뒤를 분리해주고 문자열이니 숫자형으로 변환해줘야 올바른 계산을 할 수 있다.

 

3. 주어진 입력값이 2차원 배열이니 한 번 타고 들어가야한다. for ... of 구문을 사용했고, destructuring을 활용해서 시작시간, 종료시간을 배열에서 뽑아주고, 분을 계산하는 함수에 값을 넣고 돌려주고, 계산된 값을 [시작시간, 종료시간]으로 담아준다.

 

4. 그리고 시작시간을 기준으로 정렬을 해준다. 먼저 시작하는 시간의 종료시간을 큐에 넣어준다. 

 

5. 가장 이른 시간을 제외하고 나머지 예약 시간들과 비교를 시작한다. 우선순위큐의 핵심은 배열에서 최솟값을 계속 업데이트 해줘야한다. 그래서 큐를 정렬해주고 가장 최솟값을 가지고 다음 예약시간을 비교해서 현재 종료시간이 다음 예약시간보다 크면 새로운 방을 만들고 반대로 작으면 새로운 방을 만들지 않고 그 방을 이용할 수 있게 처리한다.

 

6. 큐의 길이를 출력하면 된다. 

728x90