본문 바로가기
알고리즘

[Softeer] 회의실 예약 JS

by limew 2024. 1. 30.

 


문제 요점

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