[백준] 호텔 대실 JavaScript

·2024년 11월 8일

문제

호텔을 운영 중인 코니는 최소한의 객실만을 사용하여 예약 손님들을 받으려고 합니다. 한 번 사용한 객실은 퇴실 시간을 기준으로 10분간 청소를 하고 다음 손님들이 사용할 수 있습니다.
예약 시각이 문자열 형태로 담긴 2차원 배열 book_time이 매개변수로 주어질 때, 코니에게 필요한 최소 객실의 수를 return 하는 solution 함수를 완성해주세요.

제한사항

1 ≤ book_time의 길이 ≤ 1,000

  • book_time[i]는 ["HH:MM", "HH:MM"]의 형태로 이루어진 배열입니다
    • [대실 시작 시각, 대실 종료 시각] 형태입니다.
  • 시각은 HH:MM 형태로 24시간 표기법을 따르며, "00:00" 부터 "23:59" 까지로 주어집니다.
    • 예약 시각이 자정을 넘어가는 경우는 없습니다.
    • 시작 시각은 항상 종료 시각보다 빠릅니다.

입력

book_time : [["15:00", "17:00"], ["16:40", "18:20"], ["14:20", "15:20"], ["14:10", "19:20"], ["18:20", "21:20"]]

출력

3

내가 했던 풀이 방법

  1. book_time들을 모두 00:00 형태가 아닌 숫자 형태로 변경한다. 이때, 퇴실 시간은 청소시간을 포함해 10분을 추가해준다.
  2. book_time을 정렬해준다. 먼저 입실하는 방부터 우선체크해준다.
  3. 가장 먼저 들어오는 예약 시간을 담은 방을 하나 추가해 used에 담아준다. 즉 used는 방을 의미하고 [] 방이 하나씩 추가 되면 [[], []] 형태가 될것이다. 여기서 방에 들어오게 되면 예약 시간을 담아준다. 즉 [[[입실, 퇴실]], [[입실, 퇴실]]] 형태가 될 것이다. 여기서 입실/퇴실 시간이 겹치지 않는다면, 같은 방을 사용하게 되는 것이다.
  4. 모든 book_time을 체크해준다. isEnter는 해당 예약이 방이 배정되었는지를 의미한다. 초기값은 false이다. 방의 순차적으로 체크해준다. 방마다 isPossible이 존재하고 isPossible은 해당 방을 이용할 수 있는지를 의미한다. 초기값은 true이다. 해당 방의 예약시간이 현재 예약시간과 겹칠 경우 isPossible를 false로 바꿔주고 해당 방 검사를 그만한다. 하나의 방을 검사할 때마다 isPossible을 체크해주고 true일 경우, 해당 방으로 현재 예약 시간을 배정한다. 배정되었으므로, isEnter를 true로 만들고 해당 예약 시간 체크를 그만한다. 만약 모든 방을 다 검사했을 때에도 isEnter가 false라면 모든 방을 이용할 수 없는 것이므로 추가 방이 필요하다. used에 현재 예약 시간을 담은 방 하나를 저장한다.
  5. 4번이 끝나면 used에 length는 필요한 방의 개수가 남게 된다. 이를 return 해주면 된다.

코드

function solution(book_time) {
    var answer = 1;
    for(let i=0; i<book_time.length; i++) {
        book_time[i][0] = book_time[i][0].split(":").map(Number);
        book_time[i][0] = 60*book_time[i][0][0] + book_time[i][0][1];
        book_time[i][1] = book_time[i][1].split(":").map(Number);
        book_time[i][1] = 60*book_time[i][1][0] + book_time[i][1][1]+10;
    }
    
    book_time.sort((a, b)=>a[0]-b[0]);
    let used = [[[book_time[0][0], book_time[0][1]]]];
    
    for(let i=1; i<book_time.length; i++) {
        let isEnter = false;
        for(let j=0; j<used.length; j++) {
            let isPossible = true;
            for(let k=0; k<used[j].length; k++) {
                if(used[j][k][0]<=book_time[i][0] && used[j][k][1]>book_time[i][0]) {
                    isPossible = false;
                    break;
                }
            }
            if(isPossible) {
                used[j].push([book_time[i][0], book_time[i][1]]);
                isEnter = true;
                break;
            }
        }
        if(!isEnter) {
            used.push([[book_time[i][0], book_time[i][1]]]);
        }
    }
    
    return used.length;
}

회고

청소시간 생각 못해서 또 실수.... 테스트케이스에서 청소시간 좀 따져주지..까비

profile
Frontend🍓

0개의 댓글