선분 3개가 평행하게 놓여 있습니다. 세 선분의 시작과 끝 좌표가 [[start, end], [start, end], [start, end]] 형태로 들어있는 2차원 배열 lines
가 매개변수로 주어질 때, 두 개 이상의 선분이 겹치는 부분의 길이를 return 하도록 solution 함수를 완성해보세요.
lines
가 [[0, 2], [-3, -1], [-2, 1]]일 때 그림으로 나타내면 다음과 같습니다.
선분이 두 개 이상 겹친 곳은 [-2, -1], [0, 1]로 길이 2만큼 겹쳐있습니다.
lines
의 길이 = 3lines
의 원소의 길이 = 2lines
의 원소는 [a, b] 형태이며, a, b는 각각 선분의 양 끝점 입니다.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
입출력 예 #3
💡 문제풀이 과정
- 제한 조건을 보면
lines
의 원소[start, end]
는-100 ≤ start < end ≤ 100
이라고 한다. 따라서배열의 길이는 200
으로0을 원소
로 가지는 배열을 하나 만든다.let arr = new Array(200).fill(0);
여기서 선분의 시작점과 끝점은arr배열의 인덱스
가 된다. 3개의 선분을 각각 시작점부터 끝점까지 1씩 더해주는데 해당하는 인덱스에 선분이 한 번만 지나간 지점들은1
, 두 선분이 만나 한 번 겹친 지점들은2
, 세 선분이 만나 두 번 겹친 지점은3
이 되게 한다.- 한 가지 주의할 것은 선분의 시작점이
음수
가 될 수도 있기에arr
배열의 인덱스를 0번부터 시작하지 않는다. 따라서 선분의 시작점이 0인 경우 arr[100]이 해당되고, 시작점이 -1인 경우는 arr[99]가 해당된다.for()
와while()
문을 이용하여arr
의 특정 인덱스(세 선분의 시작점~끝점)에 1씩 더하는 작업을 수행시킨다. 마지막으로arr.filter((v) ⇒ v > 1).length;
를 통해arr
의 원소가1을 초과하는 것(2 혹은 3)들의 개수
를 반환한다.
✅ 답안
function solution(lines) {
let arr = new Array(200).fill(0);
for (let i of lines) {
let [a, b] = i;
while (a < b) {
a++;
arr[a + 99]++;
}
}
return arr.filter((v) => v > 1).length;
}