프로그래머스 - 호텔 대실
프로그래머스 - 호텔 대실
Link
https://school.programmers.co.kr/learn/courses/30/lessons/155651
접근 방법
네이버, 카카오 공채 1번에 등장할 법한 문자열 처리 및 구현 문제이다.
백준 회의실 배정이랑 비슷한 문제라서 접근 방법도 아주 조~금만 다른 듯 하다.
- 우선은 방의 개수가 예약 개수만큼 필요하다고 가정한다.
- 예약 시간 목록의 원소들을 시작 시간이 빠른 순으로 정렬해준다.
- 순서대로 탐색하며 이전 예약이 있는 경우, 해당 예약의 끝나는 시간과 현재 예약의 시작 시간을 비교한다.
- 두 시간을 비교해서 10분 이상 차이가 난다면 이전 예약을 원래 예약 목록에서 제거한다. (이후 비교 대상에서 제거하기 위함)
- 필요한 방의 개수에서 1을 빼준다. 끝.
Implementation
- 우선은 방의 개수가 예약 개수만큼 필요하다고 가정한다.
let roomCount = book_time.length;
- 예약 시간 목록의 원소들을 시작 시간이 빠른 순으로 정렬해준다.
book_time.sort((a, b) => {
const first = a[0].split(":");
const next = b[0].split(":");
if (first[0] !== next[0]) {
return first[0] - next[0];
} else {
return first[1] - next[1];
}
});
-
순서대로 탐색하며 이전 예약이 있는 경우, 해당 예약의 끝나는 시간과 현재 예약의 시작 시간을 비교한다.
-
두 시간을 비교해서 10분 이상 차이가 난다면 이전 예약을 원래 예약 목록에서 제거한다. (이후 비교 대상에서 제거하기 위함)
-
필요한 방의 개수에서 1을 빼준다. 끝.
const isPreRoomReady = (a, b) => {
const aTime = a[0] * 60 + Number(a[1]);
const bTime = b[0] * 60 + Number(b[1]);
return aTime - bTime >= 10;
};
for (let i = 0; i < book_time.length; i++) {
let curStart = book_time[i][0].split(":");
for (let k = 0; k < i; k++) {
let preEnd = book_time[k][1].split(":");
if (isPreRoomReady(curStart, preEnd)) {
book_time.splice(k, 1);
i -= 1;
roomCount -= 1;
break;
}
}
}
Code
function solution(book_time) {
let roomCount = book_time.length;
book_time.sort((a, b) => {
const first = a[0].split(":");
const next = b[0].split(":");
if (first[0] !== next[0]) {
return first[0] - next[0];
} else {
return first[1] - next[1];
}
});
const isPreRoomReady = (a, b) => {
const aTime = a[0] * 60 + Number(a[1]);
const bTime = b[0] * 60 + Number(b[1]);
return aTime - bTime >= 10;
};
for (let i = 0; i < book_time.length; i++) {
let curStart = book_time[i][0].split(":");
for (let k = 0; k < i; k++) {
let preEnd = book_time[k][1].split(":");
if (isPreRoomReady(curStart, preEnd)) {
book_time.splice(k, 1);
i -= 1;
roomCount -= 1;
break;
}
}
}
return roomCount;
}