코딩테스트
뇌주름 살리기 - 17
라퐁
2025. 1. 31. 22:35
겹치는 선분의 길이
선분 3개가 평행하게 놓여 있습니다. 세 선분의 시작과 끝 좌표가 [[start, end], [start, end], [start, end]]
형태로 들어있는 2차원 배열 lines
가 매개변수로 주어질 때, 두 개 이상의 선분이 겹치는 부분의 길이를 return 하도록 solution 함수를 완성해보세요.
function solution(lines) {
//각 선분의 [a, b]를 오름차순으로 정렬
let lSort = lines.map((x) => x.sort((x, y) => x- y));
//점 a와 b를 이엇을 때 인덱스 a가 1이 되도록 각 선분 초기화
//0번은 [-100, -99], 1번은 [-99, -98]
//동일하게 198번은 [98, 99], 199번은 [199, 200]
let l = [new Array(200), new Array(200), new Array(200)];
let a = 0;
let b = 0;
for(let i = 0; i < 3; i++) {
//음수 처리를 위해 100 기준으로 계산
a = lSort[i][0] < 0 ? 100 - Math.abs(lSort[i][0]) : 100 + lSort[i][0];
b = lSort[i][1] < 0 ? 100 - Math.abs(lSort[i][1]) : 100 + lSort[i][1];
for(let j = 0; j < 200; j++) {
if(j >= a && j < b) {
l[i][j] = 1;
}
}
}
//3개의 각 선분 비교 후 겹치는 부분이 1이 됨
let lOver = new Array(200);
for(let i = 0; i < 2; i++) {
for(let j = i + 1; j < 3; j++) {
for(let k = 0; k < 200; k++) {
if(l[i][k] === 1 && l[i][k] === l[j][k]) {
lOver[k] = 1;
}
}
}
}
//null이 아닌 1의 개수가 겹치는 선분의 길이
return lOver.filter((x) => x === 1).length;
}
문제 제약조건에 모든 점은 정수라는 조건도 없고... 길이가 아닌 점을 기준으로 풀다보니 [[1,2],[2,3],[3,4]]
같은 케이스 해결이 안 되서 결국 다른 사람한테 힌트 받고 해결했다; 생각의 전환을 못하고 괜히 시간만 오래 잡아먹었네. 혹시나 중첩 for문을 줄이고 실행속도를 더 빠르게할 방안이 있을지 고민해보기.