프로그래머스 겹치는 선분의 길이 JS

choi yh·2023년 1월 31일
0

겹치는 선분의 길이

문제

선분 3개가 평행하게 놓여 있습니다. 세 선분의 시작과 끝 좌표가 [[start, end], [start, end], [start, end]] 형태로 들어있는 2차원 배열 lines가 매개변수로 주어질 때, 두 개 이상의 선분이 겹치는 부분의 길이를 return 하도록 solution 함수를 완성해보세요.

lines가 [[0, 2], [-3, -1], [-2, 1]]일 때 그림으로 나타내면 다음과 같습니다.

1차시도 실패


function solution(lines) {
    let total = (lines[0][1]-lines[0][0]) + (lines[1][1]-lines[1][0]) + (lines[2][1]-lines[2][0])
    console.log(total)
    let arr = lines.join(',')
    // let arr1 = arr.map(x => parseInt(x))
    
    let arr2 = arr.split(',').map(Number).sort((a,b) => a - b)
    return total - (arr2[5] - arr2[0])  
}

2차시도 - 통과

const solution = (lines) => {
    let sumArr = []
    let max, min ;
    let ans = 0
    //모든 원소 배열에 추가
    for (let i = 0 ; i < lines.length; i ++){
        for ( let j = lines[i][0] ; j < lines[i][1] + 1 ; j ++ ){
            sumArr.push(j)    
        }
    }
    sumArr.sort((a,b) => a - b)
    max = sumArr.at(-1)
    min = sumArr[0]
    
    const findDuplicate = sumArr => sumArr.filter((item, idx) => sumArr.indexOf(item) !== idx)
    const duplicate = findDuplicate(sumArr);
    const dulist = new Set(duplicate)
    const list = [...dulist]
    for ( let k = 1; k < list.length; k ++){
        if ( list[k-1] + 1 === list[k] ){
            ans += 1
        }
    }
    if ( (lines[0][1]-lines[0][0])+(lines[0][1]-lines[0][0])+(lines[0][1]-lines[0][0]) === max - min ) return 0;
    console.log(dulist)
    return ans
}

접근방식

  1. 먼저 1,2,3 번 배열이 지나는 모든 점을 배열에 추가했다.
  2. 정렬을 하여 최소, 최댓값을 구한다.
  3. filter함수로 중복요소를 찾는다.
  4. 중복요소가 연속으로 붙어있으면 선이 만들어짐으로 ans에 1을 추가한다.
    ** 이부분을 생각을 못했는데 [0,1],[1,2],[2,3] 이런식으로 lines를 받으면 중복요소는 1,2가 되고 ans가 1이 되지만 중복된 선은 없다. 이부분을 예외처리 하줬다.

다른분 풀이


function solution(lines) {
    let line = new Array(200).fill(0);

    lines.forEach(([a, b]) => {
        for(; a < b; a++) line[a+100]++;
      //;initialization블럭 생략
    });

    return line.reduce((a, c) =>  c > 1 ? a + 1 : a, 0)
}
profile
더 높은곳으로 올라가기

0개의 댓글