겹치는 선분의 길이

선분 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문을 줄이고 실행속도를 더 빠르게할 방안이 있을지 고민해보기.

'코딩테스트' 카테고리의 다른 글

뇌주름 살리기 - 19  (0) 2025.02.04
뇌주름 살리기 - 18  (0) 2025.02.02
뇌주름 살리기 - 16  (0) 2025.01.25
뇌주름 살리기 - 15  (0) 2025.01.24
뇌주름 살리기 - 14  (0) 2025.01.24

+ Recent posts