프론트엔드 개발자의 기록 공간

[백준 node.js] 1931번_회의실배정 본문

알고리즘_JS/백준_Greedy

[백준 node.js] 1931번_회의실배정

[리우] 2020. 12. 25. 01:20

백준 그리디 알고리즘 11047번_동전 0

난이도 : 실버 II

 

문제설명

입출력

 

문제 풀이 : 이 문제의 핵심은 회의 시작 시간과 끝나는 시간이 주어지는데 겹치지 않게 회의를 진행할때 몇번의 회의를 진행할 수 있는지 파악하면된다.

일단 주어진 입력을 회의가 끝나는 시간을 기준으로 정렬을 해준다. 왜냐하면 회의가 끝나야지만 다음 회의가 진행되기 때문이다.

이후 정렬된 회의 목록을 기준으로 반복문을 통해 n번째 회의 끝나는 시간과 n+1번째 회의 시작을 비교한다.

n+1이 더 크거나 같다면 회의 끝난후 다음 회의를 바로 시작할 수 있기 때문이다.

이렇게 한다면 최대 회의 개수를 파악할 수 있다.

 

 

// 실버2 회의실배정
function solution(n, list) {

    //회의 끝나는 시간 기준으로 정렬
    list.sort(function(a, b) { 

        //회의 끝나는 시간이 동일하다면 시작 시간으로 정렬
        if(a[1] === b[1]){
            return a[0] - b[0]
        }
        else{
            return a[1] - b[1];
        }
    });
    
    //초기 세팅
    let count = 1;
    let tmp = list[0][1];

    //회의 시작 끝나는 시간과 시작 시간 비교
    for(let i=1; i<n; i++){
        if(tmp <= list[i][0]){
            tmp = list[i][1];
            count += 1;
        }
    }
    console.log(count);
}

const readline = require("readline");
const rl = readline.createInterface({
    input: process.stdin,
    output: process.stdout,
});

let input = [];
rl.on("line", function (line) {
    //여러줄 입력
    input.push(line);
}).on("close", function () {
    //n명
    let n = parseInt(input[0]);
    //회의실 list
    input = input.slice(1);

    //2차원배열로 int형으로 변환
    let list = [];
    for(i of input){
        list.push(i.split(' ').map((el) => parseInt(el)));
    }

    solution(n, list);
});

 

* js에서 정렬은 sort로만 이용하면 제대로된 정렬이 이루어지지 않는다(ASCII 문자 순서대로 정렬되기 때문에) 

그래서 sort함수를 이용해 안에서 return을 이용하여 정렬을 해준다.  2차원 배열과 필요한 조건을 토대로 로직을 구성하면된다.

728x90
Comments