# 겹치는 선분의 길이

## **문제 설명**

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

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

![line\_2.png](https://grepp-programmers.s3.ap-northeast-2.amazonaws.com/files/production/e4122d8b-9ce2-49ce-a360-3d1284babd8a/line_2.png)

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

***

**제한사항**

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

***

**입출력 예**

| lines                         | result |
| ----------------------------- | ------ |
| \[\[0, 1], \[2, 5], \[3, 9]]  | 2      |
| \[\[-1, 1], \[1, 3], \[3, 9]] | 0      |
| \[\[0, 5], \[3, 9], \[1, 10]] | 8      |

***

**입출력 예 설명**

입출력 예 #1

* 두 번째, 세 번째 선분 \[2, 5], \[3, 9]가 \[3, 5] 구간에 겹쳐있으므로 2를 return 합니다.

입출력 예 #2

* 겹친 선분이 없으므로 0을 return 합니다.

입출력 예 #3

* 첫 번째와 두 번째 선분이 \[3, 5] 구간에서 겹칩니다.
* 첫 번째와 세 번째 선분 \[1, 5] 구간에서 겹칩니다.
* 두 번째와 세 번째 선분 \[3, 9] 구간에서 겹칩니다.
* 따라서 \[1, 9] 구간에 두 개 이상의 선분이 겹쳐있으므로, 8을 return 합니다.

## 코드

```javascript
function solution(lines) {
    let obj = {};
    lines.forEach(([start, end]) => {
        for(let i = start; i <= end; i++) {
            i in obj ? obj[i]++ : obj[i] = 1;
        }
    })
    let answer = 0;
    for(key in obj) {
       if(obj[key] > 1 && obj[String(Number(key)+1)] > 1) answer += 1;
    }
    return answer;
}
```

처음에 시도한 코드. 테스트 케이스 3번, 7번에서 실패해서 80점이 나왔다.

다시 살펴보니 빠뜨린 케이스는 3개의 선분에서 이어지는 점이 겹칠 때 이어지는 선분은 없는데 check\[key] > 1 조건에 만족해서 같이 카운트 되는 경우이다.

ex) \[1,3]\[3,4]\[4,5] -> 이어지는 선분이 없으므로 0 return

👉 **다시 해결한 코드**

```javascript
function solution(lines) {
    let obj = {};
    let answer = 0;
    
    lines.forEach(([start, end]) => {
        for(let i = start; i <= end; i++) {
            i in obj ? obj[i]++ : obj[i] = 1;
        }
    })

    lines.sort((a,b) => a[0]-b[0]);
    if (lines[0][1] === lines[1][0]) obj[lines[1][0]] -= 1;
    if (lines[1][1] === lines[2][0]) obj[lines[1][1]] -= 1;
    
    for(key in obj) {
       if(obj[key] > 1 && obj[String(Number(key)+1)] > 1) answer += 1;
    }
    return answer;
}
```

겹치는 경우에 중복되어서 카운트 되었으므로 값을 하나 빼주었다.

### 다른 풀이

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

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

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

start와 end에 해당하는 공간을 모두 채운 후에 두번 이상 채워진 건 겹쳐진 것이므로 그것의 갯수를 구한다. 훨씬 깔끔하고 처리도 빠른 것 같다!


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://songeun.gitbook.io/coding-test/lv.0/63.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
