개발자 홍창기

Web Developer

프로그래머스 - 호텔 대실

Link

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

접근 방법

네이버, 카카오 공채 1번에 등장할 법한 문자열 처리 및 구현 문제이다.

백준 회의실 배정이랑 비슷한 문제라서 접근 방법도 아주 조~금만 다른 듯 하다.

  • 우선은 방의 개수가 예약 개수만큼 필요하다고 가정한다.
  • 예약 시간 목록의 원소들을 시작 시간이 빠른 순으로 정렬해준다.
  • 순서대로 탐색하며 이전 예약이 있는 경우, 해당 예약의 끝나는 시간과 현재 예약의 시작 시간을 비교한다.
  • 두 시간을 비교해서 10분 이상 차이가 난다면 이전 예약을 원래 예약 목록에서 제거한다. (이후 비교 대상에서 제거하기 위함)
  • 필요한 방의 개수에서 1을 빼준다. 끝.

Implementation

  • 우선은 방의 개수가 예약 개수만큼 필요하다고 가정한다.
let roomCount = book_time.length;
  • 예약 시간 목록의 원소들을 시작 시간이 빠른 순으로 정렬해준다.
book_time.sort((a, b) => {
  const first = a[0].split(":");
  const next = b[0].split(":");
  if (first[0] !== next[0]) {
    return first[0] - next[0];
  } else {
    return first[1] - next[1];
  }
});
  • 순서대로 탐색하며 이전 예약이 있는 경우, 해당 예약의 끝나는 시간과 현재 예약의 시작 시간을 비교한다.

  • 두 시간을 비교해서 10분 이상 차이가 난다면 이전 예약을 원래 예약 목록에서 제거한다. (이후 비교 대상에서 제거하기 위함)

  • 필요한 방의 개수에서 1을 빼준다. 끝.

const isPreRoomReady = (a, b) => {
  const aTime = a[0] * 60 + Number(a[1]);
  const bTime = b[0] * 60 + Number(b[1]);
  return aTime - bTime >= 10;
};
for (let i = 0; i < book_time.length; i++) {
  let curStart = book_time[i][0].split(":");
  for (let k = 0; k < i; k++) {
    let preEnd = book_time[k][1].split(":");
    if (isPreRoomReady(curStart, preEnd)) {
      book_time.splice(k, 1);
      i -= 1;
      roomCount -= 1;
      break;
    }
  }
}

Code

function solution(book_time) {
  let roomCount = book_time.length;

  book_time.sort((a, b) => {
    const first = a[0].split(":");
    const next = b[0].split(":");
    if (first[0] !== next[0]) {
      return first[0] - next[0];
    } else {
      return first[1] - next[1];
    }
  });

  const isPreRoomReady = (a, b) => {
    const aTime = a[0] * 60 + Number(a[1]);
    const bTime = b[0] * 60 + Number(b[1]);
    return aTime - bTime >= 10;
  };

  for (let i = 0; i < book_time.length; i++) {
    let curStart = book_time[i][0].split(":");
    for (let k = 0; k < i; k++) {
      let preEnd = book_time[k][1].split(":");
      if (isPreRoomReady(curStart, preEnd)) {
        book_time.splice(k, 1);
        i -= 1;
        roomCount -= 1;
        break;
      }
    }
  }
  return roomCount;
}