문제 간단설명
예약한 [대실 시작 시각, 대실 종료 시각] 의 배열이 담겨있는 2차원 배열이 주어진다.
한 방이 사용중이라면, 퇴실 시간 이후에 10분의 청소 시간을 가진 후에 다른 사람이 사용할 수 있다.
이럴 경우 최소 몇 개의 방이 있어야 모든 예약을 받을 수 있는지 반환하는 문제이다.
제한 사항
- 1 <= book_time의 길이 <= 1,000
- book_time[i]는 ["HH:MM", "HH:MM"]의 형태로 이루어진 배열
- [대실 시작 시각, 대실 종료 시각]을 나타냄
- 시각은 HH:MM의 형태로 24시간 표기법을 따르며, "00:00"부터 "23:59" 까지로 주어짐
- 예약 시각이 자정을 넘어가는 경우는 없음
- 시작 시각은 항상 종료 시각보다 빠름
- book_time[i]는 ["HH:MM", "HH:MM"]의 형태로 이루어진 배열
성공 코드
function solution(book_time) {
/**
* 시간 문자열을 분으로 바꿔주는 함수이다.
*
* @param {string} time hh:mm 형식의 시간 문자열
* @returns 분으로 치환한 정수
*/
const covertToMinutes = (time) => {
const [hours, minutes] = time.split(':').map(Number);
return hours * 60 + minutes;
};
const bookMinuteList = [...book_time].map((time) => {
const [start, end] = time;
// 정리 시간 10분까지 미리 더해준다.
return [covertToMinutes(start), covertToMinutes(end) + 10];
});
// 시작 시간 기준으로 오름차순 정렬한다.
bookMinuteList.sort((a, b) => a[0] - b[0]);
const roomList = [];
for (const [start, end] of bookMinuteList) {
// 비어있는 방의 인덱스를 찾는다.
const emptyRoomIndex = roomList.findIndex((room) => room <= start);
// 만약 비어있는 방이 없다면 새로운 방을 추가한다.
if (emptyRoomIndex === -1) {
roomList.push(end);
} else {
// 만약 방이 있다면, 퇴실 시간을 갱신한다.
roomList[emptyRoomIndex] = end;
}
}
return roomList.length;
}
이 문제는 대실 시작시간으로 정렬하는 것이 키포인트인 것 같다.
정렬한 리스트를 순회하면서, 현재 순회중인 대실 시작 시간으로 바로 들어갈 수 있는 방이 있다면, 그 인덱스에 해당하는 방의 대실 종료 시각을 현재 순회중인 종료 시각으로 갱신해준다.
만약 들어갈 수 있는 방이 없다면 새로운 방이 필요하므로 현재 순회중인 종료 시각을 리스트에 push 해준다.
그리고 마지막에 roomList 배열의 길이가 곧 방의 개수이므로 길이를 반환해주면 된다.
'PS > Programmers' 카테고리의 다른 글
Programmers / Level 2 / 배달 / JS (0) | 2024.07.12 |
---|---|
Programmers / Level 2 / 숫자 카드 나누기 / JS (0) | 2024.07.10 |
Programmers / Level 2 / 쿼드압축 후 개수 세기 / JS (0) | 2024.07.06 |
Programmers / Level 2 / 2개 이하로 다른 비트 / JS (0) | 2024.07.05 |