
겹치는 선분의 길이
문제설명 :
선분 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
입출력 예
my_string | result |
[[0, 1], [2, 5], [3, 9]] | 2 |
[[-1, 1], [1, 3], [3, 9]] | 0 |
[[0, 5], [3, 9], [1, 10]] | 8 |
첫번째 접근
: lines의 각 요소를 가져와 시작점 부터 끝점의 숫자로 채워진 배열을 만들어 arr에 넣어주었다. 다음으로 arr의 1번 요소까지 반복문을 돌려 해당 배열의 이후 배열에 해당 배열의 요소가 있는지 확인하고 있으면 해당 요소를 answer 배열에 push하였다. 하나의 배열의 while문이 끝날때 마다 answer 배열에 빈 스트링(" ")을 넣어 구분해주었다. 이후 string으로 변환한 후 trim()을 사용해 앞뒤 여백을 제거했고 split(" ")을 사용해 다시 배열로 만들어주었다.
중복된 값을 제거해주기 위해 Set()을 사용한 후 '배열의 각 요소의 길이 - 1'을 새로운 배열 a에 push해주었다. 마지막으로 a 배열의 각 요소를 모두 더해주었다. 틀렸다. 테스트케이스는 통과되었지만, 최종통과가 되지 않았다.
function solution(lines) {
let answer = []
let arr = []
lines.forEach(el => {
let nums = []
let c = el[0]
while(c <= el[1]){
nums.push(c)
c++
}
arr.push(nums)
})
for(let i=0; i<2; i++) {
let k = lines[i][0]
let j = lines[i][1]
while(k <= j){
let index = arr[i+1].indexOf(k)
if(index > -1) answer.push(arr[i+1][index])
k++
}
answer.push(" ")
}
let a = []
answer = answer.join("").trim().split(" ")
answer = new Set(answer).forEach(el => a.push(el.length -1))
return a.reduce((a, c) => a+c, 0)
}
solution
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)
}
let line = new Array(200).fill(0);
: a와 b의 값이 -100 ~ 100 사이이므로 길이가 200이고 0으로 채워진 새로운 배열 line을 만든다.
lines.forEach(([a, b]) => {
for(; a < b; a++) line[a+100]++;
});
: 이후 lines의 각 요소를 가져와 'line[a+100]++'을 해준다.
a에 100을 더하는 이유는 음수 인덱스를 피하기 위함이며 line 배열의 인덱스는 -100 ~ 99이다.
return line.reduce((a, c) => c > 1 ? a + 1 : a, 0)
: line 배열의 각 요소를 가져와 값이 2 이상인 경우에만 a에 더해줘 겹치는 선분의 길이를 반환한다.
'자료구조 및 알고리즘 > JavaScript Practice' 카테고리의 다른 글
JS Practice) 프로그래머스 : 짝수와 홀수 (0) | 2023.05.12 |
---|---|
JS Practice) 프로그래머스 : 평행 (1) | 2023.05.10 |
JS Practice) 프로그래머스 : 안전지대 (0) | 2023.05.02 |
JS Practice) 프로그래머스 : 연속된 수의 합 (0) | 2023.05.01 |
JS Practice) 프로그래머스 : 다음에 올 숫자 (1) | 2023.04.28 |