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

ungnam·2023년 6월 7일

programmers level0

목록 보기
22/29
post-thumbnail

https://school.programmers.co.kr/learn/courses/30/lessons/120876

나의 풀이

function solution(lines) {
    lines.sort((a, b) => a[0] - b[0]);
    const included = new Set();
    let dot;
    
    dot = lines[1][0];
    // 1번째 선분과 2번째 선분 비교
    while (dot < Math.min(lines[0][1], lines[1][1])) {
        included.add(dot);
        dot++;
    }
    
    dot = lines[2][0];
    // 2번째 선분과 3번째 선분 비교
    while (dot < Math.min(lines[1][1], lines[2][1])) {
        included.add(dot);
        dot++;
    }
    
    // 1번째 선분과 3번째 선분 비교
    while (dot < Math.min(lines[0][1], lines[2][1])) {
        included.add(dot);
        dot++;
    }
    
    return included.size;
}

✔ 총 주어지는 선분은 3개이므로, 선분을 비교하는 경우의 수는 1-2, 1-3, 2-3 총 3가지이다.
✔ 두 번 이상 겹치는 부분이 있을 수가 있으니 이 경우 Set을 통해 중복을 제거

ex) lines[[0, 5], [1, 10], [3, 9]]인 경우
[0, 5][1, 10] 비교 시 1Math.min(5, 10)보다 더 작으므로 1,2,3,4를 포함
[1, 10][3, 9] 비교 시 3Math.min(10, 9)보다 더 작으므로 중복을 제외한 5,6,7,8를 포함
[0, 5][3, 9] 비교 시 3Math.min(5, 9)보다 더 작지만 중복이므로 포함 X

결과로 나온 included의 개수 = 겹치는 선분의 길이

참고할 만한 풀이

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

    lines.forEach(([a, b]) => {
        while (a < b) line[(a++) + 100]++;
    });

    return line.reduce((a, c) =>  c > 1 ? a + 1 : a, 0);
}

-100 ≤ a < b ≤ 100에 의해 모든 선분을 표현할 수 있는 배열의 최소 개수가 200이라는 것을 이용한 새로운 방법
✔ 각 선분을 돌면서 포함되는 구간에는 1씩 더해줌
line의 요소가 23인 경우가 겹치는 선분의 길이이므로, reduce를 통해 이 경우 1씩 더해주면 된다.

profile
꾸준함을 잃지 말자.

0개의 댓글