문제 요점
N개의 회의실, 9~18시, 시 단위, M개의 회의, 소문자이름
회의실 별 빈 시간대 출력
풀이
크기가 18이고 1로 이루어진 배열을 만든다
예약 기록들을 보며 배열에서 이미 예약된 부분은 0으로 변경한다
방 별 예약가능한 range를 찾는다 (배열의 1인 부분)
Object객체를 key로 오름차순 정렬하기
Object.keys(객체).sort().reduce((newObj, curr) => {
newObj[curr] = 객체[curr];
return newObj;
}, {});
전체코드
const readline = require('readline');
const rl = readline.createInterface({
input : process.stdin,
output : process.stdout
});
const lines = [];
// input
rl.on('line', input => {
lines.push(input.split(' ').map(e => isNaN(e) ? e : parseInt(e)));
})
rl.on('close', () => {
const [roomCount, meetingCount] = lines.splice(0, 1)[0];
const rooms = lines.splice(0, roomCount);
const meetings = lines;
const roomObj = {};
// 방 초기화
for (const room of rooms) {
roomObj[room] = Array.from({length: 18}, (_, i) => {
if (i<9) return 0;
return 1;
})
}
for (const [name, start, end] of meetings) {
for (let i = start; i < end; i++) {
roomObj[name][i] = 0;
}
}
const availableRooms = {};
for (const [name, rooms] of Object.entries(roomObj)) {
// 1인 구간 찾기
let isStarted = false;
const ranges = [];
let range = [];
for (let i = 0; i <= 18; i++) {
if (rooms[i] === 1) {
if (!isStarted) {
isStarted = true;
range[0] = i;
}
} else {
if (isStarted) {
range[1] = i;
ranges.push(range);
range = [];
isStarted = false;
}
}
}
if (range.length) {
ranges.push(range);
}
availableRooms[name] = ranges;
}
const sortedObj = Object.keys(availableRooms).sort().reduce((acc, curr) => {
acc[curr] = availableRooms[curr];
return acc;
}, {})
const obj = Object.entries(sortedObj);
for (let i = 0; i < roomCount; i++) {
const [name, validTimes] = obj[i];
console.log(`Room ${name}:`);
if (!validTimes.length) {
console.log('Not available');
} else {
console.log(`${validTimes.length} available:`);
}
for (const [start, end] of validTimes) {
console.log(`${makeTwoDigit(start)}-${makeTwoDigit(end)}`);
}
if (i < roomCount-1) {
console.log('-----')
}
}
process.exit();
})
function makeTwoDigit(num) {
let str = String(num);
if (str.length === 1) {
str = 0 + str;
}
return str;
}
'알고리즘' 카테고리의 다른 글
[Softeer] 통근버스 출발 순서 검증하기 JS (0) | 2024.01.30 |
---|---|
[Softeer] 진정한 효도 JS (0) | 2024.01.30 |
[Softeer] GBC JS풀이 (0) | 2024.01.29 |
[Softeer] 장애물 인식 프로그램 JS (0) | 2024.01.29 |
[Softeer] 금고털이 JS (0) | 2024.01.25 |