알고리즘
[프로그래머스 LV2] 호텔 대실 JS
limew
2023. 10. 4. 15:22
https://school.programmers.co.kr/learn/courses/30/lessons/155651
문제요점
- 10분청소 후 다음 사용가능
- 필요한 최소객실수는?
풀이
- 분으로 변환
- 시작시각 오름차순
- 각 방마다 입실 가능한 시각을 저장하는 배열 canEnterTimes을 시각 오름차순정리
- 첫번째방 추가 (이때 10분의 청소시간도 플러스)
- 다음 방부터 순회를 돌며
- 들어 갈 수 있는 방이 없는 경우 (현재 예약의 입실 시각 < 가장 빠른 입실 가능한 시각)
- 방추가
- 현재 입실하는 방의 다음 입실 가능시각 canEnterTimes에 추가 (+ 10 청소시간)
- canEnterTimes 가장 빨리 입실 가능한 시각 오름차순으로 갱신
- 들어 갈 수 있는 방이 있는 경우
- canEnterTimes에서 첫번째 제거 (이전의 빨리 들어 갈 수 있는 방의에 현재의 고객이 들어감)
- 현재 입실하는 방의 다음 입실 가능시각 canEnterTimes에 추가 (+ 10 청소시간)
- canEnterTimes 가장 빨리 입실 가능한 시각 오름차순으로 갱신
- 들어 갈 수 있는 방이 없는 경우 (현재 예약의 입실 시각 < 가장 빠른 입실 가능한 시각)
// 10분청소 후 다음 사용가능
// 필요한 최소객실수는?
// 분으로 변환
// 시작시각 오름차순
// 각 방마다 입실 가능한 시각을 저장하는 배열 (오름차순)
function solution(book_time) {
var answer = 0;
const bookArr = book_time.map(book => {
const convertToNum = book.map(b => {
const [h, m] = b.split(':');
return Number(h)*60+Number(m);
})
return {start: convertToNum[0], end: convertToNum[1]};
}).sort((a, b) => a.start - b.start);
const canEnterTimes = [bookArr[0].end+10]; // 각 방마다 입실가능한 시각
answer++; // 첫번째방
for (let i = 1; i < bookArr.length; ++i) {
const {start, end} = bookArr[i];
// 들어갈 수 있는 방이 없는 경우
if (start < canEnterTimes[0]) {
answer++; // 방추가
}
// 들어갈 수 있는 방이 있는 경우
else {
canEnterTimes.shift(); // 이미 퇴실한 방 제거
}
canEnterTimes.push(end+10); // (새로운 방이나 기존 방에) 현재 입실하는 방의 다음 입실가능시각 추가
canEnterTimes.sort((a, b) => a-b); // 가장 빠른 다음 입실시각 갱신
}
return answer;
}
느낀점
문제를 잘 읽자 10분의 청소시간
또다른 풀이
function solution(book_time) {
var answer = 0;
const bookArr = book_time.map(book => {
const convertToNum = book.map(b => {
const [h, m] = b.split(':');
return Number(h)*60+Number(m);
})
return {start: convertToNum[0], end: convertToNum[1]};
}).sort((a, b) => a.start - b.start);
const canEnterTimes = [bookArr[0].end+10];
answer++; // 첫번째방
for (let i = 1; i < bookArr.length; ++i) {
const {start, end} = bookArr[i];
// 들어갈 수 있는 방 찾기
let createRoom = true;
for (let j = 0; j < canEnterTimes.length;j++) {
// 방 찾음
if (canEnterTimes[j] <= start) {
canEnterTimes.splice(j, 1);
canEnterTimes.push(end+10);
createRoom = false;
break;
}
}
if (createRoom) {
answer++;
canEnterTimes.push(end+10);
}
}
return answer;
}