
https://school.programmers.co.kr/learn/courses/30/lessons/120876
function solution(lines) {
lines.sort((a, b) => a[0] - b[0]);
const included = new Set();
let dot;
dot = lines[1][0];
// 1번째 선분과 2번째 선분 비교
while (dot < Math.min(lines[0][1], lines[1][1])) {
included.add(dot);
dot++;
}
dot = lines[2][0];
// 2번째 선분과 3번째 선분 비교
while (dot < Math.min(lines[1][1], lines[2][1])) {
included.add(dot);
dot++;
}
// 1번째 선분과 3번째 선분 비교
while (dot < Math.min(lines[0][1], lines[2][1])) {
included.add(dot);
dot++;
}
return included.size;
}
✔ 총 주어지는 선분은 3개이므로, 선분을 비교하는 경우의 수는 1-2, 1-3, 2-3 총 3가지이다.
✔ 두 번 이상 겹치는 부분이 있을 수가 있으니 이 경우 Set을 통해 중복을 제거
ex) lines가 [[0, 5], [1, 10], [3, 9]]인 경우
✔ [0, 5]와 [1, 10] 비교 시 1이 Math.min(5, 10)보다 더 작으므로 1,2,3,4를 포함
✔ [1, 10]와 [3, 9] 비교 시 3이 Math.min(10, 9)보다 더 작으므로 중복을 제외한 5,6,7,8를 포함
✔ [0, 5]와 [3, 9] 비교 시 3이 Math.min(5, 9)보다 더 작지만 중복이므로 포함 X
결과로 나온 included의 개수 = 겹치는 선분의 길이
function solution(lines) {
let line = new Array(200).fill(0);
lines.forEach(([a, b]) => {
while (a < b) line[(a++) + 100]++;
});
return line.reduce((a, c) => c > 1 ? a + 1 : a, 0);
}
✔ -100 ≤ a < b ≤ 100에 의해 모든 선분을 표현할 수 있는 배열의 최소 개수가 200이라는 것을 이용한 새로운 방법
✔ 각 선분을 돌면서 포함되는 구간에는 1씩 더해줌
✔ line의 요소가 2나 3인 경우가 겹치는 선분의 길이이므로, reduce를 통해 이 경우 1씩 더해주면 된다.