ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • #AIL_23.12.21 // Programmers_호텔 대실**********
    AIL( Algorithm I Learned) 2023. 12. 21. 19:08

    ## AIL_ 호텔 대실**********

    *** 문제 설명
    호텔을 운영 중인 코니는 최소한의 객실만을 사용하여 예약 손님들을 받으려고 합니다. 한 번 사용한 객실은 퇴실 시간을 기준으로 10분간 청소를 하고 다음 손님들이 사용할 수 있습니다.예약 시각이 문자열 형태로 담긴 2차원 배열 book_time이 매개변수로 주어질 때, 코니에게 필요한 최소 객실의 수를 return 하는 solution 함수를 완성해주세요.


    *** 제한사항
    1 ≤ book_time의 길이 ≤ 1,000book_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개의 방이 필요합니다.

    ## solution.JavaScript

    1. 문제의 접근 방식

    주어진 문제는 여러개의 예약 시간이 주어졌을 때, 이를 관리하여 필요한 최소한의 객실 수를 구하는 것입니다. 각 예약 시간은 시작 시간과 종료 시간으로 구성되어 있습니다. 주어진 함수 `solution`은 예약 시간들을 처리하고, 필요한 최소 객실 수를 반환합니다. 

     

    1) 먼저 주어진 예약 시간을 시작 시간으로 기준  정렬

     

    2) 각 예약 시간에 대해 시작 시간을 분으로 환산하여 처리

     

    3) 이미 사용 중인 객실이 있는지 확인하고, 있다면 해당 객실의 종료 시간을 업데이트

     

    4) 만약 이미 사용 중인 객실이 없다면, 새로운 객실이 필요한 것으로 판단하고 객실 목록에 추가

     

    5) 모든 예약 시간을 처리한 후, 객실 목록의 길이를 반환하여 필요한 최소 객실 수를 구하기


    2. 문제풀이

    function solution(예약시간) {
      // 시작 시간 순으로 정렬
      예약시간.sort();
    
      // 종료 시간을 저장할 배열
      const 객실목록 = [];
    
      // 예약 시간을 하나씩 확인
      for (const 시간대 of 예약시간) {
        // 시작 시간 분리
        const [시작_시, 시작_분] = 시간대[0].split(":").map(Number);
        const 시작시간 = 시작_시 * 60 + 시작_분;
    
        // 종료 시간 찾기
        let 객실_찾음 = false;
        for (let i = 0; i < 객실목록.length; i++) {
          if (객실목록[i] <= 시작시간) {
            객실목록[i] = 다음이용가능시간(시간대[1]);
            객실_찾음 = true;
            break;
          }
        }
    
        // 새로운 객실 필요한 경우 추가
        if (!객실_찾음) {
          객실목록.push(다음이용가능시간(시간대[1]));
        }
      }
    
      // 필요한 최소 객실 수 반환
      return 객실목록.length;
    }
    
    // 다음 이용 가능 시간 계산 함수
    function 다음이용가능시간(종료시간) {
      const [종료_시, 종료_분] = 종료시간.split(":").map(Number);
      return 종료_시 * 60 + 종료_분 + 10;
    }
    /*
    테스트 1
    입력값 〉	[["15:00", "17:00"], ["16:40", "18:20"], ["14:20", "15:20"], ["14:10", "19:20"], ["18:20", "21:20"]]
    기댓값 〉	3
    실행 결과 〉	테스트를 통과하였습니다.
    테스트 2
    입력값 〉	[["09:10", "10:10"], ["10:20", "12:20"]]
    기댓값 〉	1
    실행 결과 〉	테스트를 통과하였습니다.
    테스트 3
    입력값 〉	[["10:20", "12:30"], ["10:20", "12:30"], ["10:20", "12:30"]]
    기댓값 〉	3
    실행 결과 〉	테스트를 통과하였습니다.
    */

     

    1. 여기서 sort() 함수를 사용하여 주어진 예약시간 배열을 시작 시간을 기준으로 오름차순으로 정렬하고 있습니다.

    // 주어진 예약 시간을 시작 시간을 기준으로 정렬합니다.
    예약시간.sort();

     

    2. 객실목록이라는 배열을 선언하여 각 객실의 종료 시간을 저장할 것입니다.

    // 종료 시간을 저장할 배열
    const 객실목록 = [];

     

    3. for...of 루프를 사용하여 주어진 예약 시간을 하나씩 처리합니다.

    // 예약 시간을 하나씩 확인
    for (const 시간대 of 예약시간) {

     

    4. 각 예약 시간의 시작 시간을 split(":") 함수를 사용하여 시간과 분으로 분리하고, map(Number)를 사용하여 숫자로 변환합니다. 그리고 시작 시간을 분 단위로 환산하여 시작시간에 저장합니다.

      // 시작 시간 분리
      const [시작_시, 시작_분] = 시간대[0].split(":").map(Number);
      const 시작시간 = 시작_시 * 60 + 시작_분;

     

    5. 객실_찾음이라는 변수를 사용하여 현재 예약 시간에 대해 이미 사용 중인 객실이 있는지 여부를 판단합니다. for 루프를 사용하여 객실 목록을 확인하고, 만약 현재 객실이 이미 사용 중이라면 종료 시간을 업데이트하고 객실_찾음true로 설정합니다.

      // 종료 시간 찾기
      let 객실_찾음 = false;
      for (let i = 0; i < 객실목록.length; i++) {
        if (객실목록[i] <= 시작시간) {
          객실목록[i] = 다음이용가능시간(시간대[1]);
          객실_찾음 = true;
          break;
        }
      }

     

    6. 객실_찾음false인 경우, 현재 예약 시간에 대해 이미 사용 중인 객실이 없으므로 새로운 객실이 필요한 것으로 판단하고, 다음이용가능시간 함수를 사용하여 종료 시간을 계산하고, 객실 목록에 추가합니다.

      // 새로운 객실 필요한 경우 추가
      if (!객실_찾음) {
        객실목록.push(다음이용가능시간(시간대[1]));
      }

     

    7. 모든 예약 시간을 처리한 후, 객실 목록의 길이를 반환하여 필요한 최소 객실 수를 구합니다. 여기까지가 solution 함수의 주요한 부분입니다. 

    // 필요한 최소 객실 수 반환
    return 객실목록.length;

     

    8. 다음이용가능시간 함수는 종료 시간을 받아 다음 이용 가능한 시간을 계산하는 함수입니다. 종료 시간을 분으로 환산하고 10분을 더한 값을 반환합니다.

    // 다음 이용 가능 시간 계산 함수
    function 다음이용가능시간(종료시간) {
      const [종료_시, 종료_분] = 종료시간.split(":").map(Number);
      return 종료_시 * 60 + 종료_분 + 10;
    }

    #  결국 혼자서 풀어내지 못했던 문제......다시 공부해야겠다......

     

Designed by Tistory.