[Programmers] 호텔 대실 - JavaScript

Joosi_Cool·2023년 4월 30일
3

Programmers

목록 보기
72/98
post-thumbnail
post-custom-banner

문제설명

호텔을 운영 중인 코니는 최소한의 객실만을 사용하여 예약 손님들을 받으려고 합니다. 한 번 사용한 객실은 퇴실 시간을 기준으로 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

example1
위 사진과 같습니다.

입출력 예 #2

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

입출력 예 #3

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

출처: 프로그래머스 코딩 테스트 연습, https://programmers.co.kr/learn/challenges



설계 과정

  • 두개의 함수 생성
  1. 시간 12:30을 받으면 숫자의 형태로 리턴 해주는 형태 (=>1230)
  2. 시간을 받으면 +10을 해서 리턴해주는 형태 (1240)
    -> 단, 이는 60분을 넘어갈때 이를 고려해줘야한다.
  • 풀이 시작
  1. 우선 받은 숫자 배열을 내림차순으로 정렬
  2. roomArr = [] 생성 => 이 안에 들어가 있는 시간 배열이 방을 쓰고 있는 구조이다.
  3. 초기값 입력받은 0인덱스의 배열 값을 대입하고 시작
  4. 배열의 요소를 1부터 끝까지 아래 과정 수행
    1) roomArr을 앞에서부터 청소가 끝난 방이 있는지 체크
    -> 2번함수(roomArr[][1]) <= 1번 함수(체크하고 있는 시간)
    2) 이게 성립하면 청소가 끝난 방에 체크한 배열이 대신 들어감.
    3) 성립안한다면, roomArr에 새로운 방배정 -> push를 해줌.
  5. 마지막에 배열의 길이를 리턴


정답 코드

function timeFun(a){
    var aTotal = a.split(":").join("");
    return Number(aTotal);
}

function plusTimeFun(a){
    var aTotal = a.split(":");
    aTotal[0] = Number(aTotal[0]);
    aTotal[1] = Number(aTotal[1]);
    if(aTotal[1]>=50){
        aTotal[0]++;
        aTotal[1] = (aTotal[1] + 10)-60; 
    }
    else{
        aTotal[1]+=10;
    }
    return aTotal[0]*100+aTotal[1];
}

function solution(book_time) {
    //오름차순으로 정렬
    book_time = book_time.sort((a,b)=>{
        if(a[0]>b[0]){
            return 1;
        }
        else{
            return -1;
        }
    })
    var roomArr = [book_time[0]];
    var frontElement;
    var backElement;
    for(var i = 1;i<book_time.length;i++){
        frontElement = book_time[i][0];
        backElement = book_time[i][1];
        var check = false;
        for(var rIndex = 0; rIndex < roomArr.length;rIndex++){
            if((plusTimeFun(roomArr[rIndex][1]))<=timeFun(frontElement)){
                roomArr[rIndex] = [frontElement,backElement];
                check = true;
                break;
            }  
        }
        if(check===false){
            roomArr.push([frontElement,backElement]);
        }
    }
    return roomArr.length;
}


결과



profile
집돌이 FE개발자의 노트
post-custom-banner

0개의 댓글