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

lee-goeun·2023년 5월 8일
0

문제출처
https://school.programmers.co.kr/learn/courses/30/lessons/155651

문제 설명

호텔을 운영 중인 코니는 최소한의 객실만을 사용하여 예약 손님들을 받으려고 합니다. 한 번 사용한 객실은 퇴실 시간을 기준으로 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" 까지로 주어집니다.
      • 예약 시각이 자정을 넘어가는 경우는 없습니다.
      • 시작 시각은 항상 종료 시각보다 빠릅니다.

입출력 예

문제풀이

  1. 방에 해당하는 answer배열을 변수로 선언한다. ( index에 따라 0번방, 1번방 )
  2. book_time 배열을 돌면서 입실시간과 퇴실시간을 분으로 변경해주고 입실 시간을 기준으로 오름차순 정렬한다.
  3. 재정의된 book_time 배열을 돌면서 현재 입실되어 있는 방(answer 배열) 퇴실 시간+청소시간(10분) 중 입실시간 보다 작거나 같은 값을 필터한다. 값이 있다면 그 방은 퇴실된 방이고 없다면 이용 중인 방이다.
  4. 퇴실된 방이 있으면 그 방에 새로운 예약 손님의 퇴실시간을 넣고 없으면 answer 배열에 값을 추가하여 방을 새로 부여한다.
  5. 총 손님이 들어있는 방의 길이를 리턴한다.

코드

function solution(book_time) {
    var answer = [];
    book_time = book_time.map(v => {
        let [start, end] = v;
        start = start.split(":")[0] * 60 + parseInt(start.split(":")[1]);
        end = end.split(":")[0] * 60 + parseInt(end.split(":")[1]);
        return [parseInt(start), parseInt(end)];
    }).sort((a,b) => a[0] - b[0]);

    for(let i=0; i<book_time.length; i++){
        let booked =  answer.filter(v => v+10 <= book_time[i][0]);
        if(booked.length > 0) answer[answer.indexOf(booked[0])] = book_time[i][1];
        else answer.push(book_time[i][1]);
    }
    return answer.length;
}

다른사람 코드

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

function solution(book_time) {
    const timeArr = Array.from({ length: makeMinStamp('23:59') + 10 }, () => 0);

    book_time.forEach((time, i) => {
        const [s, e] = time;
        let start = makeMinStamp(s);
        const end = makeMinStamp(e) + 9;

        for (start; start <= end; start++) {
            timeArr[start]++;
        }
    });

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

매번 parseInt를 사용하여 숫자형식으로 변환해주었는데 함수로 만들어서 한번에 숫자형식으로 변환하는 게 좋은 방법인 거 같다.

코드 리팩토링

function solution(book_time) {
    var answer = [];
    book_time.map(v => v = [makeMin(v[0]), makeMin(v[1])])
        .sort((a,b) => a[0] - b[0])
        .map(time => {
            let [start, end] = time;
            let booked = answer.filter(v => v+10 <= start);
            if(booked.length > 0) answer[answer.indexOf(booked[0])] = end;
            else answer.push(end);
    });
    return answer.length;
}

const makeMin = (time) => {
    let [hour, min] = time.split(":").map(v => Number(v));
    return hour * 60 + min;
}

TIL

  • 숫자형식변환 : Number(txt)

0개의 댓글