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

2023. 6. 26. 17:33코딩연습

1. 문제

https://school.programmers.co.kr/learn/courses/30/lessons/155651

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

2. 풀이

1) 시작 시간을 기준으로 오름차순 정렬해준다.

2) 새로운 배열 rooms를 만들어놓고 정렬된 예약 시각을 반복해서 돌린다.

3) 반복은 rooms에 있는 종료 시간보다 큰 예약 시작 시간을 찾는다.

4) 만약 rooms에 있는 종료 시간이 더 작다면 예약 종료 시간 + 10분으로 변경하고, 

더 크다면 새로운 예약 종료 시간 + 10분을 추가한다.

 

** 주의 사항 : 퇴실 시간 기준으로 10분을 추가해주어야 한다.

function solution(book_time) {
    book_time.sort(); // 시작 시간을 기준으로 정렬
    
    /** 예약 시각을 분단위로 변경해주는 함수 */
    const convertTime = (time) => {
        const [h,m] = time.split(":").map(v => +v);
        return h * 60 + m;
    }
    
    /** 예약 시각을 변경하여 담을 배열 */
    const bookTime = book_time.map(time => {
        const [start, end] = time;
        return [convertTime(start), convertTime(end) + 10]
    })
    
    /** 시각을 담을 배열 */
    const rooms = [];
    
    /** 예약 시각을 반복문을 돌리며 확인. */
    bookTime.forEach((time) => {
        const [start, end] = time;
        
        const idx = rooms.findIndex((room) => room <= start);
        if(idx === -1) rooms.push(end);
        else rooms[idx] = end;
    })
    
    return rooms.length;  
}

 

3. 정리

- 처음에 분 단위로 돌린다고 계획하고 함수를 만들었었는데 60을 곱해야하는데 24를 곱하고 있었다.......  테스트 케이스는 맞는데 왜 채점하면 틀리는지 이해가 안갔었는데 다행히도 발견했다. 앞으로 꼼꼼하게 확인해야겠다.

- 계획대로 배열에 담고 종료 시각과 다음 시작 시각을 비교하는 방법을 생각했었는데 findIndex()가 생각나지 않아 splice()를 사용했었다. 시간 초과로 인해서 변경했다.

 

* 사용한 함수 : findIndex(), forEach(), map(), split(), sort()