문제
풀이
- 문제에서 주어진 일정을 시작일을 기준으로 오름차순 정렬한다.
- calendar 배열을 통해 날짜마다 몇 개의 일정이 존재하는지 구한다.
- 연속적으로 일정이 존재하면 width를 계속 증가시키고 height는 최대값으로 변경한다.
- 중간에 일정이 끊어지면 width와 height를 초기화한다.
소스 코드
const filePath = process.platform === "linux" ? "/dev/stdin" : "./input.txt";
const input = require("fs")
.readFileSync(filePath)
.toString()
.trim()
.split("\n");
const N = +input[0]; // 일정의 개수
const arr = [];
const calendar = new Array(365 + 1).fill(0);
let w = 0;
let h = 0;
let answer = 0;
for (let i = 1; i <= N; i++) {
const plan = input[i].split(" ").map(Number);
arr.push(plan);
}
// 시작 날짜가 빠른순으로 정렬
arr.sort((arr1, arr2) => {
if (arr1[0] === arr2[0]) return arr2[1] - arr1[1];
return arr1[0] - arr2[0];
});
for (const [start, end] of arr) {
for (let day = start; day <= end; day++) {
calendar[day] += 1;
}
}
for (let i = 1; i <= 365; i++) {
if (calendar[i] >= 1) {
w += 1;
h = Math.max(h, calendar[i]);
}
if (calendar[i] === 0 || i === 365) {
answer += w * h;
w = 0;
h = 0;
}
}
console.log(answer);