PS/Programmers

Programmers / Level 2 / 호텔 대실 / JS

KimMinJun 2024. 7. 10. 20:25

문제 간단설명

예약한 [대실 시작 시각, 대실 종료 시각] 의 배열이 담겨있는 2차원 배열이 주어진다.

한 방이 사용중이라면, 퇴실 시간 이후에 10분의 청소 시간을 가진 후에 다른 사람이 사용할 수 있다.

이럴 경우 최소 몇 개의 방이 있어야 모든 예약을 받을 수 있는지 반환하는 문제이다.

 

제한 사항

  • 1 <= book_time의 길이 <= 1,000
    • book_time[i]는 ["HH:MM", "HH:MM"]의 형태로 이루어진 배열
      • [대실 시작 시각, 대실 종료 시각]을 나타냄
    • 시각은 HH:MM의 형태로 24시간 표기법을 따르며, "00:00"부터 "23:59" 까지로 주어짐
      • 예약 시각이 자정을 넘어가는 경우는 없음
      • 시작 시각은 항상 종료 시각보다 빠름

 

성공 코드

function solution(book_time) {
  /**
   * 시간 문자열을 분으로 바꿔주는 함수이다.
   *
   * @param {string} time hh:mm 형식의 시간 문자열
   * @returns 분으로 치환한 정수
   */
  const covertToMinutes = (time) => {
    const [hours, minutes] = time.split(':').map(Number);

    return hours * 60 + minutes;
  };

  const bookMinuteList = [...book_time].map((time) => {
    const [start, end] = time;

    // 정리 시간 10분까지 미리 더해준다.
    return [covertToMinutes(start), covertToMinutes(end) + 10];
  });

  // 시작 시간 기준으로 오름차순 정렬한다.
  bookMinuteList.sort((a, b) => a[0] - b[0]);

  const roomList = [];
  for (const [start, end] of bookMinuteList) {
    // 비어있는 방의 인덱스를 찾는다.
    const emptyRoomIndex = roomList.findIndex((room) => room <= start);

    // 만약 비어있는 방이 없다면 새로운 방을 추가한다.
    if (emptyRoomIndex === -1) {
      roomList.push(end);
    } else {
      // 만약 방이 있다면, 퇴실 시간을 갱신한다.
      roomList[emptyRoomIndex] = end;
    }
  }

  return roomList.length;
}

 

이 문제는 대실 시작시간으로 정렬하는 것이 키포인트인 것 같다.

정렬한 리스트를 순회하면서, 현재 순회중인 대실 시작 시간으로 바로 들어갈 수 있는 방이 있다면, 그 인덱스에 해당하는 방의 대실 종료 시각을 현재 순회중인 종료 시각으로 갱신해준다.

 

만약 들어갈 수 있는 방이 없다면 새로운 방이 필요하므로 현재 순회중인 종료 시각을 리스트에 push 해준다.

 

그리고 마지막에 roomList 배열의 길이가 곧 방의 개수이므로 길이를 반환해주면 된다.