Lv.0 - 겹치는 선분의 길이_01.06

송철진·2023년 1월 6일
0

문제 설명

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

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

선분이 두 개 이상 겹친 곳은 [-2, -1], [0, 1]로 길이 2만큼 겹쳐있습니다.

제한사항
lines의 길이 = 3
lines의 원소의 길이 = 2
모든 선분은 길이가 1 이상입니다.
lines의 원소는 [a, b] 형태이며, a, b는 각각 선분의 양 끝점 입니다.
-100 ≤ a < b ≤ 100

입출력 예

linesresult
[[0, 1], [2, 5], [3, 9]]2
[[-1, 1], [1, 3], [3, 9]]0
[[0, 5], [3, 9], [1, 10]]8

나의 코드

function solution(lines) {
    let arr = []
    for(let el of lines){
        let [a,b] = el;
        if(a+1 === b){ 
            arr.push(el)
        }else{
            for(let i = a; i<b; i++){
                arr.push([i,i+1])
            }  
        }
    }
    const result = {};
    arr.forEach((x) => { 
        result[x] = (result[x] || 0)+1; 
    });
    return Object.values(result).filter(el => el !== 1).length

풀이

  1. lines의 el에 대하여 순회한다
    el의 최소값 a, 최대값 b 일 때
for(let el of lines){
    let [a,b] = el;
	// 2.~
}
  1. 최소값과 최대값의 차가 1이하 때는 그대로 유지
    1보다 크면 쪼갠다 : [a, a+1], [a+1, a+2], ..., [b-1,b] 까지
if(a+1 === b){ 
    arr.push(el)
}else{
    for(let i = a; i<b; i++){
        arr.push([i,i+1])
    }  
}
  1. 배열 arr에서 중복 요소의 개수를 구해야 하므로
    빈 객체 result에 대해 순회하여
    배열 arr의 요소가 result에 없으면 0(초기값), 있으면 그값에 +1 한다
const result = {};
arr.forEach((x) => { 
    result[x] = (result[x] || 0)+1; 
});
  1. 중복요소는 result의 key-value 쌍 중에서 value가 1이 아닌 것이다.
return Object.values(result).filter(el => el !== 1).length

(참고) 배열의 중복 값 개수 구하기
https://hianna.tistory.com/459

profile
검색하고 기록하며 학습하는 백엔드 개발자

0개의 댓글