프로그래머스/Lv.2

프로그래머스 JS 호텔 대실 (겹치는 시간대)

sakuraop 2023. 12. 10. 01:25

호텔 대실 (20) 문제 보기


문제 조건

목표: 대실이 가장 많을 때 몇 개의 방이 예약되어 있는지를 구해야 한다.

 

최소한의 객실만 사용한다.

한 번 사용한 객실은 퇴실 시간을 기준으로 10분 청소시간이 필요하다.

문제 풀이

1. 3600개의 0을 지닌 배열을 만든다. 
2. [시작시간, 퇴실시간 + 10]을 구한다.
3. for문으로 (시작시간)~(퇴실시간+10) 구간의 요소에 +1 해준다.
4. 최대 값을 Math.max()로 찾는다.

코드

function getMinute(time) {
  const [hour, min] = time.split(":");
  return hour * 60 + Number(min);
}

function solution(book_time) {
  const timeTable = Array(60 * 60).fill(0);

  // [체크인시간, 퇴실시간+10] 구하기
  book_time.forEach((time) => {
    const checkInMinute = getMinute(time[0]);
    const checkOutMinute = getMinute(time[1]) + 10;

    // 포함되는 구간의 요소에 +1 해주기
    for (let i = checkInMinute; i < checkOutMinute; i++) {
      timeTable[i]++;
    }
  });

  return Math.max(...timeTable);
}

 

00:00부터 23:59 까지 분 단위로만 구하면 되기 때문에

최대 연산은 3600 * 1000 밖에 안 된다. 0.1초도 안걸린다.

 

정렬, 그리디 같은 방법 어찌저찌 쓰면 좋을 것 같긴 한데,

그건 필요하면 생각해보기로 하고 빠르게 풀 수 있을 것 같으니 그냥 복잡하게 생각하지 않고 풀기로 했다.

 

for문을 이용해서 입실시간-퇴실시간 사이 구간에 객실 수를 +1 해주기만 하면 된다.