[프로그래머스] 호텔 대실

Moky·2023년 5월 8일
0

Programmers

목록 보기
7/7

문제

문제 링크

호텔을 운영 중인 코니는 최소한의 객실만을 사용하여 예약 손님들을 받으려고 합니다. 한 번 사용한 객실은 퇴실 시간을 기준으로 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 result
[["15:00", "17:00"], ["16:40", "18:20"], ["14:20", "15:20"], ["14:10", "19:20"], ["18:20", "21:20"]] 3
[["09:10", "10:10"], ["10:20", "12:20"]] 1
[["10:20", "12:30"], ["10:20", "12:30"], ["10:20", "12:30"]] 3

입출력 예 설명

입출력 예 #1


위 사진과 같습니다.

입출력 예 #2

첫 번째 손님이 10시 10분에 퇴실 후 10분간 청소한 뒤 두 번째 손님이 10시 20분에 입실하여 사용할 수 있으므로 방은 1개만 필요합니다.

입출력 예 #3

세 손님 모두 동일한 시간대를 예약했기 때문에 3개의 방이 필요합니다.

풀이

방이 필요할 때는 사람이 추가로 들어왔을때다.
예약을 입실 시간 기준 오름차순으로 순회하며 퇴실 시간을 기록한 room 배열에 기록한다.
입실 시간 기준으로 room에 기록된 퇴실 시간이 지난 방을 비워준다.
room배열의 최대길이를 반환한다.

링크

질문 목록에 있던 풀이다.
괄호의 최대 깊이를 구하는 문제와 유사하게 풀었다.
(ex. {{}{}{{{}}} => 4)
입실과 퇴실을 하나의 배열에 시간순으로 정렬한다.
해당 시간이 입실이면 +1 퇴실이면 -1
이때 최대값을 구해주면 된다.

코드

function getTime(str) {
  const [h, m] = str.split(":");
  return Number(h) * 60 + Number(m);
}
function solution(book_time) {
  var answer = 0;
  let arr = [];
  book_time
    .sort((a, b) => (a[0] > b[0] ? 1 : -1))
    .forEach(([s, e]) => {
      const start = getTime(s);
      const end = getTime(e);
      room.push(end + 10);
      room = arr.filter((x) => x > start);
      if (arr.length > answer) answer = arr.length;
    });
  return answer;
}
function solution(book_time) {
  let answer = 0;
  let now = 0;
  const arr = [];
  for (const [s, e] of book_time) {
    arr.push([getTime(s), 1]);
    arr.push([getTime(e) + 10, -1]);
  }
  arr.sort((a, b) => (a[0] === b[0] ? a[1] - b[1] : a[0] - b[0]));
  for (const [_, type] of arr) {
    now += type;
    if (now > answer) answer = now;
  }
  return answer;
}

0개의 댓글