Algorithm JS - 회의실 배정

jiny·2022년 9월 18일
0

JavaScript Algorithm

목록 보기
8/23
post-thumbnail

문제

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

입력 설명

첫째 줄에 회의의 수 n(1<=n<=100,000)이 주어진다. 둘째 줄부터 n+1 줄까지 각 회의의 정 보가 주어지는데 이것은 공백을 사이에 두고 회의의 시작시간과 끝나는 시간이 주어진다. 회의의 시작시간과 끝나는 시간의 조건은 (시작시간 <= 끝나는 시간)입니다.

출력 설명

첫째 줄에 최대 사용할 수 있는 회의 수를 출력하여라.

알고리즘

  • 전체 회의 배열 생성
  • 전체 회의 배열 내에서 회의의 끝나는 시간이 모두 같을 경우 시작 시간을 정렬
  • 그게 아닐경우 끝나는 시간으로 정렬
  • 전체 회의 배열을 순회
  • 각 회의의 시작시간이 끝나는 시간보다 크거나 같을 경우 회의 횟수 1 증가

소스 코드

let input = require("fs").readFileSync(__dirname + "/input.txt").toString().trim().split("\n").slice(1).join(" ").split(" ");

// 입력 값에 있는 것들로 전체 회의 배열
let entireMeeting = [];
// 할 수 있는 최대한의 회의 횟수
let answer = 0;
// 배열 안에 있는 회의의 끝나는 시간
let endTime = 0;

// 전체 회의 배열 생성
for (let i = 0; i < input.length / 2; i++) {
  if (i === 0) {
    entireMeeting.push([input[0], input[1]]);
  } else {
    entireMeeting.push([input[2 * i], input[2 * i + 1]]);
  }
}

// 전체 회의 배열 정렬 => 회의의 끝나는 시간이 모두 같을 경우 시작 시간을 정렬, 아닐 경우 끝나는 시간을 정렬
entireMeeting.sort((a, b) => {
  if (a[1] === b[1]) return a[0] - b[0];
  else return a[1] - b[1];
});

// 전체 회의 배열을 순회
for (let partMeeting of entireMeeting) {
  // 만약 회의의 시작시간이 끝나는 시간보다 크거나 같을 경우
  if (partMeeting[0] >= endTime) {
    // 회의 횟수 1 증가
    answer++;
    // 끝나는 시간을 그 회의의 끝나는 시간으로 설정
    endTime = partMeeting[1];
  }
}

console.log(answer);

0개의 댓글