본문 바로가기

프로그래머스 - Lv.2 호텔 대실 (정렬) node.js 본문

개발/algorithm

프로그래머스 - Lv.2 호텔 대실 (정렬) node.js

자전하는명왕성 2023. 12. 6. 10:32

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

해당 문제는 어제 정렬을 활용하여 '가능한 회의의 횟수'를 출력하는 문제와 비슷한 문제지만, 다른 점이 있다면 이 문제의 경우는 '최소 객실의 수를 요구'한다.

2024.01.05 - [개발/algorithm] - 백준1931 - 회의실 배정 (정렬) Python

 

문제 풀이 방식

먼저, 손님들에게 방을 배정하는 방식을 배열로 구현하려 했다. 

이미 손님들을 배정한 방 중에서, 입력값으로 들어온 시간으로 방 배정이 불가능한 경우에는 방을 새로 배정해야 하므로 배열에 종료 시간을 추가하고, (이미 배정한 방 중 가장 빠른 퇴실 시간 + 청소 시간 <= 입력값의 입실 시간인 경우)

반대로 방배정이 가능한 경우에는, 이미 배정한 방에서 대실 종료 시간이 가장 빠른 값을 입력값의 종료 시간으로 수정해주는 방식으로 처리하면 되겠다고 생각했다. (이미 배정한 방 중 가장 빠른 퇴실 시간 + 청소 시간 > 입력값의 입실 시간인 경우)

이전에 선행되어야 하는 게 입력값의 정렬인데, 손님들의 방배정은 입실 시간이 빠른 순으로 진행되기 때문에, 입실 시간을 기준으로 정렬했다. (이 과정에서 '10:20' 과 같이 들어온 시간 값을 '분'으로 바꾸는 과정이 필요하다.)

이후, 앞서 언급했던 로직을 구현하고, 배열의 길이(방 배정)를 출력하면 된다.

 

전체 소스 코드

function solution(book_time) {
  const arr = book_time
    .map((el) => el.map((x) => timeTransfer(x)))
    .sort((a, b) => a[0] - b[0]); // 시작 시간 정렬
  
  // 방 배정을 담은 배열
  const result = [];
  arr.forEach(([start, end]) => {
    const minTime = Math.min(...result);

    minTime + 10 > start
      ? result.push(end) // 새로운 방 배정
      : (result[result.indexOf(minTime)] = end); // 청소 후 방 입실
  });
  return result.length;
}

// 문자열로 들어온 '시간을 분으로 바꿔 반환하는 함수
function timeTransfer(time) {
  const [hours, minutes] = time.split(":").map(Number);
  return hours * 60 + minutes;
}

console.log(
  solution([
    ["15:00", "17:00"],
    ["16:40", "18:20"],
    ["14:20", "15:20"],
    ["14:10", "19:20"],
    ["18:20", "21:20"],
  ])
);
Comments