[JS] Programmers 155651 호텔 대실

서연주·2023년 7월 7일
0

Algorithm

목록 보기
16/25

'호텔 대실'

Programmers '호텔 대실' 문제 보러가기

풀이 코드

  1. 주어진 예약 내역book_time을 예약 시작 시간이 빠른 순서로 정렬한다.
  2. 정렬된 예약 시간을 순서대로 순회하면서
    방 별 마지막 예약 종료 시간을 담은 배열 schedule에서 배정 가능한 방이 있는지 확인한다.
  3. 최종적으로 필요한 방의 개수인 schedule의 길이를 출력한다.
function solution(book_time) {
    // 시작 시간이 빠른 순으로 정렬한다
    book_time.sort(function(a, b){
        let aH = +(a[0].slice(0,2));
        let bH = +(b[0].slice(0,2));
        if(aH !== bH){
            return aH - bH;
        }
        else{
            let aM = +(a[0].slice(3,5));
            let bM = +(b[0].slice(3,5));
            return aM - bM;
        } 
            
    });
    
    // 같은 방을 쓰려면 두 예약 사이에 최소 10분 간의 텀이 있어야 한다.
    // 각 방 별 마지막 예약의 종료 시간
    var schedule = [];

    book_time.map((time)=>{
        let tH = +(time[0].slice(0,2)); 
        let tM = +(time[0].slice(3,5)); 
        
        let needMoreRoom = true;
        for(let i=0;i<schedule.length;i++){
            let sH = +(schedule[i].slice(0,2)); 
            let sM = +(schedule[i].slice(3,5)); 
            if((tH - sH)*60 + tM-sM >= 10){
                needMoreRoom = false;
                schedule[i] = time[1];
                break;
            }
        }
        if(needMoreRoom === true){
            schedule.push(time[1]);
        }
    });
    
    return schedule.length;
}
  • slice()를 이용해서 문자열을 자르고 + 키워드를 통해 숫자로 변환한다.
  • sort()를 통해 배열 내 원소를 정렬한다.
    *`sort()`
    ; 배열의 요소를 정렬한 후 그 배열을 반환한다. 정렬은 stable sort가 아닐 수 있다.
    ` arr.sort([compareFunction])`
    - `compareFunction`: 정렬 순서 정의 함수. 생략 시 문자열로 변환되어 정렬
    	- ex. banana < cheery, '80' < '9'
    - 복사본 생성 ❌ 원본 배열 정렬 ⭕️
    - `compareFunction(a, b) < 0` ➡️ a < b
    - `compareFunction(a, b) == 0` ➡️ 그대로
    - `compareFunction(a, b) > 0` ➡️ b < a
    - 숫자 오름 차순 정렬 시에는
function compareNumbers(a, b) {
  return a - b;
}

개선하기

*inschool82@gmail.com 님의 코드를 참고하였습니다.
1. 코드 모듈화 & const 사용
2. 주어진 예약 시간에서 split()을 이용하여 시간 단위와 분 단위 분리
➡️ 변수 선언 대폭 줆

*split()
; String 객체를 지정한 구분자를 이용하여 여러 개의 문자열로 나눈다.

  • 반환값: 주어진 문자열을 separator 마다 끊은 부분 문자열을 담은 Array. separator 부분은 삭제된다.
  • split()
  • split(separator)
    - separator가 빈 문자열일 경우 str의 각각의 문자가 배열의 원소 하나씩으로 변환
  • split(separator, limit)
    - limit: 끊어진 문자열의 최대 개수.
function makeMinutes(time){
    const [hour, min] = time.split(":").map(el => Number(el));
    return hour * 60 + min;
}

function solution(book_time) {
    // 시작 시간이 빠른 순으로 정렬한다
    book_time = book_time.map(time => {
        return time.map(el=>makeMinutes(el))
    });
    book_time.sort((a,b) => a[0] - b[0]);
    
    var schedule = []; // 각 방 별 마지막 예약의 시작 시간

    book_time.map((time)=>{
        
        let needMoreRoom = true;
        for(let i=0;i<schedule.length;i++){
            
            if(schedule[i]+10 <= time[0]){ // 예약 간 10분 이상의 텀이 있으면
                needMoreRoom = false;
                schedule[i] = time[1];
                break;
            }
        }
        if(needMoreRoom === true){
            schedule.push(time[1]);
        }
    });
    
    return schedule.length;
}

참고 자료

profile
pizz@ttang

0개의 댓글