function solution(lines) {
var a = [...Array(lines[0][1] - lines[0][0] + 1)].map(
(_, a) => a + lines[0][0]
);
var b = [...Array(lines[1][1] - lines[1][0] + 1)].map(
(_, a) => a + lines[1][0]
);
var c = [...Array(lines[2][1] - lines[2][0] + 1)].map(
(_, a) => a + lines[2][0]
);
let a_list = a.filter((a) => b.includes(a));
let b_list = a.filter((a) => c.includes(a));
let c_list = b.filter((b) => c.includes(b));
let total = [...a_list, ...b_list, ...c_list];
let array = new Array(201).fill(-1);
total = total.map((a) => a + 100);
for (let i = 0; i <= total.length - 1; i++) {
array[total[i]] += 1;
}
let ans_2 = array.filter((a) => (a !== -1) & (a !== 0));
let min_2 = ans_2.length > 0 ? ans_2.length - 1 : (ans_2.length = 0);
let ans_1 = ans_2.map((a) => a - 1);
let min_1 = ans_1.length > 0 ? ans_1.length - 1 : (ans_1.length = 0);
let answer1 = a_list.length > 0 ? a_list.length - 1 : (a_list.length = 0);
let answer2 = b_list.length > 0 ? b_list.length - 1 : (b_list.length = 0);
let answer3 = c_list.length > 0 ? c_list.length - 1 : (c_list.length = 0);
let answer = answer1 + answer2 + answer3 - min_2 - min_1;
return answer;
}
난이도 진짜로!!!!! 4시간 걸렸다..
처음에 구상은 값이 0이고 길이는 201인 배열(0을 포함해야함)을 하나 생성하여 입력값의 시작과 끝 값의 인덱스에 +1 을 해준다.
그 다음 0 인 데이터는 지우고 -1을 해주면 0, 1, 2로 구성된 배열이 나오는데 0 은 겹치는게 없는 인덱스 이고 1, 2가 겹친 인덱스 이다.
인덱스가 한개만 동떨어져있다면 제외.
그후 값이 2인 인덱스의 length-1, 전체 -1 한 후에 값이 1인 인덱스 length-1 을 하려함.
하지만 그림과 같이
-1 에서 0 사이는 겹치지 않았지만 -1 과 0이 값이 2로 도출되어 실패하였다.
결국 사용한 방법은 이것이다.
입력 값을 a, b, c 로 교집합을 a_list, b_list, c_list 로 넣어준다.
그다음 겹치는 게 있는 값들만 min_1, min_2 로 모아서
결과 값에서 빼준다.
점점 알고리즘을 뿌셔가시는...!!!