[programmers] 겹치는 선분의 길이

Gomao·2023년 2월 14일
0

코딩테스트 준비

목록 보기
4/20

[programmers] 겹치는 선분의 길이

일단 풀긴 풀었는데, 내 풀이가 영 마음에 안 든다.

function solution(lines) {
    var answer = 0;
    // 1,2 / 1,3 / 2,3 각각 겹치는 부분을 더하면되는데,
    // 만약 전부 겹치는 구간이 있으면 한번 빼줘야 함.
    // * 나중에 고민해볼 문제 : 선분이 n개면 어찌 할텐가??
    // 2개 선분이 겹치는건 (끝점 중에 작은것 - 시작점 중에 큰것) >= 0
    var line1 = lines[0];
    var line2 = lines[1];
    var line3 = lines[2];
    // 각 line이 겹치는 부분
    var line_12 = [Math.max(line1[0],line2[0]),Math.min(line1[1],line2[1])]
    var line_23 = [Math.max(line3[0],line2[0]),Math.min(line3[1],line2[1])]
    var line_13 = [Math.max(line1[0],line3[0]),Math.min(line1[1],line3[1])] 
    // 단 안 겹치는 경우(gap_xy[0] >= gap_xy[1] 이면 안겹침.)
    // 만약 셋다 겹치는 부분이 있다면
    var all = [Math.max(line_12[0],line3[0]),Math.min(line_12[1],line3[1])];
    
    var geopchim = [line_12[1]-line_12[0],
                    line_23[1]-line_23[0],
                    line_13[1]-line_13[0]]
    if(all[1] - all[0] >= 0){ // 
        answer = geopchim.reduce((a,b) => a+b) - (all[1]-all[0])*2;
    }
    else{
        for(i=0; i<geopchim.length; i++){
            if(geopchim[i] > 0){
                answer += geopchim[i];
            }
        }
    }
    return answer;
}

마음에 안 드는 이유
1. var line_12, var all 같은 부분을 반복문이나 필터로 나타낼 수는 없었을까? 너무 우직하게 푼 거 아닌가?

생각해볼 문제
1. 이런 식으로 문제를 풀면 Line이 3개에서 n개가 된다면? 풀수 있을까?
2. n개의 Line에 대해 같은 문제를 푼다면 복잡도를 최소화 할 수 있는 코드는 뭘까?

profile
코딩꿈나무 고마오

0개의 댓글