카테고리 없음

프로그래머스 - Level 2. 호텔 대실 / JavaScript (js)

Gray Park 2023. 2. 12. 11:30
728x90
반응형

문제설명

문제분석

타음 스케쥴링 문제입니다. OS 수업때 스케줄러를 배웠다면 좀 더 이해하기가 수월합니다. 이문제에 대입해서 요약하자면 특정 시간동안 다른 작업은 같은 공간(이 경우에는 방)에서 진행할 수 없습니다. 따라서 새로운 공간이 필요합니다. 그러나 이전 방이 비었다면, 새로운 공간을 굳이 만들 필요가 없습니다. 이 경우에는 10분간 유휴 시간이 주어지면, 다시 그 공간을 사용할 수 있습니다.

  1. 모든 입력값에는 시작시각, 종료시각이 있다.
  2. 유휴 시간을 포함해 각 시간이 중복되지 않을 경우, 방을 추가하지 않는다.
  3. 유휴 시간을 포함해 시각이 중복되는 경우, 방을 추가한다.
  4. 종료시각이 담긴 방 배열을 두고, 종료 시각을 업데이트한다.
  5. 마지막 입력값에 도달했을 때 방 배열의 길이가 최종적으로 필요한 방의 갯수이다.

문제를 단순화 했으니 이해하기 쉽게 코드를 짜보겠습니다.

이해하기 쉽게 코드작성하기

function solution(book_time) {
	// 주어진 시각을 시작시간 기준 빠른 순으로 정렬
    const sortedBookTime = book_time.sort();
    // 사용중인 방을 기록할 배열
    const usedRoom = [];
    for(let time of sortedBookTime) {
    	// 입력값의 시작시간과 종료시간을 분으로 변환
        const [[sH, sM], [eH, eM]] = time.map(x => x.split(":"));
        const startMin = Number(sH) * 60 + Number(sM);
        const endMin = Number(eH) * 60 + Number(eM) + 10;
        // 사용중인 방 중에서 (종료시각 + 10) 이 새로운 시작시각 보다 더 작은 방이 있는지 검색
        const idx = usedRoom.findIndex(x => x <= startMin);
        
        if(idx === -1) {
        	// 사용중인 방 중 조건에 맞는 방이 없다면 새로운 방을 추가
            usedRoom.push(endMin);
        } else {
        // 사용중인 방 중 조건에 맞는 방이 있다면 기존 방의 종료시각 업데이트
            usedRoom[idx] = endMin;
        }
    }
    return usedRoom.length;
}

코드가 단순하긴 하나 조금 더 추상화를 해보자면 다음처럼 리팩토링할 수 있습니다.

function solution(book_time) {
    const sortedBookTime = book_time.sort();
    const usedRoom = [];
    for(let time of sortedBookTime) {
        const [startTime, endTime] = [convertMinFromStringTime(time[0]), convertMinFromStringTime(time[1]) + 10];
        const idx = usedRoom.findIndex(x => x <= startTime);
        
        if(idx === -1) {
            usedRoom.push(endTime)
        } else {
            usedRoom[idx] = endTime;
        }
    }
    return usedRoom.length;
}

function convertMinFromStringTime(strTime) {
    const [h, m] = strTime.split(":");
    return Number(h) * 60 + Number(m);
}

sort와 reduce를 사용해서 시맨틱을 유지하면 조금 더 간결한 코드를 작성할 수도 있습니다.

function solution(book_time) {
    return book_time.sort().reduce((acc, cur) => {
        const [startTime, endTime] = [convertMinFromStringTime(cur[0]), convertMinFromStringTime(cur[1]) + 10];
        
        const idx = acc.findIndex(x => x <= startTime);
        
        if(idx === -1) {
            acc.push(endTime)
        } else {
            acc[idx] = endTime;
        }
        return acc;
    }, []).length;
}

function convertMinFromStringTime(strTime) {
    const [h, m] = strTime.split(":");
    return Number(h) * 60 + Number(m);
}

---

다음주에는 근황을 공유토록 하겠습니다. 요즘 정신이 없어서 GPT-3 이후 업데이트가 없었는데요. bing에 chatGPT가 적용되었으며, 사용자 대기열에 등록해두면 순차적으로 chatGPT가 연동된 bing 검색엔진을 만날 수 있습니다. chatGPT의 사용화가 기대되는 분이라면 대기열에 등록해보세요! (광고 아님)

728x90
반응형