알고리즘/백준

[백준] 1931번: 회의실 배정 (JavaScript, NodeJS)

정현수 2021. 8. 19. 21:49
반응형

문제

한 개의 회의실이 있는데 이를 사용하고자 하는 N개의 회의에 대하여 회의실 사용표를 만들려고 한다. 각 회의 I에 대해 시작시간과 끝나는 시간이 주어져 있고, 각 회의가 겹치지 않게 하면서 회의실을 사용할 수 있는 회의의 최대 개수를 찾아보자. 단, 회의는 한번 시작하면 중간에 중단될 수 없으며 한 회의가 끝나는 것과 동시에 다음 회의가 시작될 수 있다. 회의의 시작시간과 끝나는 시간이 같을 수도 있다. 이 경우에는 시작하자마자 끝나는 것으로 생각하면 된다.

입력

첫째 줄에 회의의 수 N(1 ≤ N ≤ 100,000)이 주어진다. 둘째 줄부터 N+1 줄까지 각 회의의 정보가 주어지는데 이것은 공백을 사이에 두고 회의의 시작시간과 끝나는 시간이 주어진다. 시작 시간과 끝나는 시간은 231-1보다 작거나 같은 자연수 또는 0이다.

출력

첫째 줄에 최대 사용할 수 있는 회의의 최대 개수를 출력한다.

예제 입력

11
1 4
3 5
0 6
5 7
3 8
5 9
6 10
8 11
8 12
2 13
12 14

예제 출력

4

정답 풀이

const fs = require("fs");
// 백준 제출 할 때 주석 제거
// const readFileSyncAddress = '/dev/stdin';
// VSC 테스트 할 때 주석 제거
const readFileSyncAddress = "input.txt";

let input = fs.readFileSync(readFileSyncAddress).toString().trim().split("\n");

// 인풋 처리
[n, ...arr] = input;
n = Number(n);
arr = arr.map((i) => i.split(" ").map((v) => Number(v)));
solution(n, arr);

// 문제 풀이
function solution(n, times) {
	// 이 문제의 정답률이 낮은 이유
    // sort를 해줄 때, 끝나는 시간으로 오름차순을 하지만
    // 예외적으로 끝나는 시간이 같을 때는 시작하는 시간 또한 오름차순이 되도록 정렬해야한다.
	times = times.sort((a, b) => {
		if (a[1] - b[1] === 0) {
			return a[0] - b[0];
		}
		return a[1] - b[1];
	});
	let nowClass = times[0];
	let answer = 1;
	for (let i = 1; i < n; i++) {
		const temp = times[i];
        // 현재 수업의 끝나는시간이 반복문의 시작시간보다 작거나 같을 때
        // 수업이 바뀐다.
		if (nowClass[1] <= temp[0]) {
			nowClass = times[i];
			answer += 1;
		}
	}

	console.log(answer);
}
반응형