문제출처
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" 까지로 주어집니다.
- 예약 시각이 자정을 넘어가는 경우는 없습니다.
- 시작 시각은 항상 종료 시각보다 빠릅니다.
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;
}