프로그래머스 - Lv.2 호텔 대실 (정렬) node.js 본문
반응형
https://school.programmers.co.kr/learn/courses/30/lessons/155651
해당 문제는 어제 정렬을 활용하여 '가능한 회의의 횟수'를 출력하는 문제와 비슷한 문제지만, 다른 점이 있다면 이 문제의 경우는 '최소 객실의 수를 요구'한다.
2024.01.05 - [개발/algorithm] - 백준1931 - 회의실 배정 (정렬) Python
문제 풀이 방식
먼저, 손님들에게 방을 배정하는 방식을 배열로 구현하려 했다.
이미 손님들을 배정한 방 중에서, 입력값으로 들어온 시간으로 방 배정이 불가능한 경우에는 방을 새로 배정해야 하므로 배열에 종료 시간을 추가하고, (이미 배정한 방 중 가장 빠른 퇴실 시간 + 청소 시간 <= 입력값의 입실 시간인 경우)
반대로 방배정이 가능한 경우에는, 이미 배정한 방에서 대실 종료 시간이 가장 빠른 값을 입력값의 종료 시간으로 수정해주는 방식으로 처리하면 되겠다고 생각했다. (이미 배정한 방 중 가장 빠른 퇴실 시간 + 청소 시간 > 입력값의 입실 시간인 경우)
이전에 선행되어야 하는 게 입력값의 정렬인데, 손님들의 방배정은 입실 시간이 빠른 순으로 진행되기 때문에, 입실 시간을 기준으로 정렬했다. (이 과정에서 '10:20' 과 같이 들어온 시간 값을 '분'으로 바꾸는 과정이 필요하다.)
이후, 앞서 언급했던 로직을 구현하고, 배열의 길이(방 배정)를 출력하면 된다.
전체 소스 코드
function solution(book_time) {
const arr = book_time
.map((el) => el.map((x) => timeTransfer(x)))
.sort((a, b) => a[0] - b[0]); // 시작 시간 정렬
// 방 배정을 담은 배열
const result = [];
arr.forEach(([start, end]) => {
const minTime = Math.min(...result);
minTime + 10 > start
? result.push(end) // 새로운 방 배정
: (result[result.indexOf(minTime)] = end); // 청소 후 방 입실
});
return result.length;
}
// 문자열로 들어온 '시간을 분으로 바꿔 반환하는 함수
function timeTransfer(time) {
const [hours, minutes] = time.split(":").map(Number);
return hours * 60 + minutes;
}
console.log(
solution([
["15:00", "17:00"],
["16:40", "18:20"],
["14:20", "15:20"],
["14:10", "19:20"],
["18:20", "21:20"],
])
);
반응형
'개발 > algorithm' 카테고리의 다른 글
백준2805 - 나무 자르기 (이분탐색) node.js (2) | 2023.12.08 |
---|---|
프로그래머스 - Lv.3 메뉴 리뉴얼 (백트래킹) node.js (0) | 2023.12.07 |
백준1931 - 회의실 배정 (정렬) Python (1) | 2023.12.05 |
백준18223 - 민준이와 마산 그리고 건우 (데이크스트라) Python (0) | 2023.12.04 |
백준7562 - 나이트의 이동 (BFS) node.js (1) | 2023.12.03 |
Comments