끄적끄적

[Programmers] 겹치는 선분의 길이 풀이(JS) 본문

Programmers

[Programmers] 겹치는 선분의 길이 풀이(JS)

2024. 1. 8. 18:34

 

첫번째 실패한 문제해결 방법과 이유)

0 - 200 까지의 array를 만들고, array의 index를 각 꼭지점으로 설정하여 선분이 존재하는 꼭지점에 +1씩 하엿다.

그리고 0 부터 200까지 순회를 한번 하며,  array의 요소가 연속으로 2이상이 나온다면 겹치는 선분이라고 판단하였다.

이는 선분이 아닌 양끝에 꼭지점이 있어도 선분이라고 판단되는 잘못된 생각이었다.

// 잘못된 코드
function solution(lines) {
    let arr = new Array(201).fill(0);
    for(let i=0; i<lines.length; i++){
        let point = lines[i];
        for(let j=point[0]; j<=point[1]; j++) arr[100+j]++;
    }
    let answer = 0;
    for(let i=0; i<arr.length-1; i++){
        if(arr[i] >=2 && arr[i+1] >= 2) {
            answer++;
        }
    }
    return answer;
}

위와 같은 풀이는 다음과 같은 그림의 형태일때 잘못된 답을 내놓는다.

 

 

위의 경우는 겹치는 선분이 0임에도, 꼭지점만 보고 판단하면 2라는 결과를 낸다.

 

따라서 꼭지점에 선이 존재하는 걸로 증가시키는 것이 아닌 , 선분이 존재하면 증가하는 걸로 변경하였다.

예를 들어 0-1이라는 선분이 존재하면 arr[0]++을 해주고,  2-3이라는 선분이 존재하면 arr[2]++를 해주는 것이다.

 

위를 해결한 풀이 이다.

function solution(lines) {
	// point1) 선분의 왼쪽을 기준으로 하기때문에 array는 201개로 설정한다
    let arr = new Array(201).fill(0);
    for(let i=0; i<lines.length; i++){
        let point = lines[i];
        for(let j=point[0]; j<point[1]; j++) {
        	// point2) 여기서 j는 point[1]보다 1작을때를 한계로 설정하여야 한다.
            arr[100+j]++;
        }
    }
    let answer = 0;
    for(let i=0; i<arr.length-1; i++){
        if(arr[i] >=2) {
        	// point3) 풀이방식의 의도대로 여기의 arr[i]는 arr[i]와 arr[i+1]이 선분으로
            // 이어져 있다는 것을 의미한다.
            answer++;
        }
    }
    return answer;
}

 

javascript의 더욱 간단한 메소드들을 이용하여 짧게 작성할 수 도 있지만 ,

for문 등 최대한 내 스스로 어떤 풀이인지 알아보기 쉽게 만들어봐야겠다..

Comments