Programmers/Level 0
<22.11.17>프로그래머스 Level 0 문제 풀이 #19
mayberry
2022. 11. 17. 10:54
Programmers Level 0 문제 풀이 #19 : 22-11-17
19-1) 겹치는 선분의 길이
문제)
빨간색, 초록색, 파란색 선분이 x축 위에 있습니다. 세 선분의 x좌표 시작과 끝이 [[start, end], [start, end], [start, end]] 형태로 들어있는 2차원 배열 lines가 매개변수로 주어질 때, 두 개 이상의 선분이 겹치는 부분의 길이를return 하도록 solution 함수를 완성해보세요.
lines가 [[0, 2], [-3, -1], [-2, 1]]일 때 그림으로 나타내면 다음과 같습니다.
선분이 두 개 이상 겹친 곳은 [-2, -1], [0, 1]로 2만큼 겹쳐있습니다.
내가 작성한 답안)
const solution = (lines) => {
//22-11-17
//0. lines를 순회하며 각 원소들의 start에서 end까지 이루어진 배열을 담은 새로운 배열(rgbArr)을 생성한다.
//1. rgbArr를 순회하며 각 배열(it)의 원소(itm)들의 해당 인덱스와 +1 인덱스로 이루어진 length 2의 배열을 빈 배열(distanceArr)에 추가한다.
//2. distanceArr를 순회하면서 해당 원소(it)가 자신(arr)에게 포함되어있는지 중복여부를 판단한다(slice 이용)
//2-A. it이 arr에게 포함되어있을 경우
//2-A-1. 빈 배열(finalArr)에 해당 원소를 추가한다.
//2-B. it이 arr에게 포함되어있지 않을 경우
//2-B-1. 아무것도 하지 않고 순회를 계속한다.
//3. finalArr에 중복검사를 통해 중복되는 원소를 제거한다.
//4. 중복 원소를 제거한 finalArr의 length를 반환한다.
const distanceArr = [];
const finalArr = [];
const rgbArr = lines.map(it => new Array((it[1] - it[0]) + 1)
.fill(0)
.map((_, idx) => it[0] + idx));
rgbArr.map(it => (
it.map((itm, idx, arr) => (
idx !== arr.length - 1 ? distanceArr.push([itm, arr[idx + 1]]) : false
))
))
distanceArr.join('|')
.split('|')
.map((it, idx, arr) => (
arr.slice(idx + 1, arr.length).includes(it) ? finalArr.push(it) : false
))
const answer = [...new Set(finalArr)];
return answer.length;
}
19-2) 평행
문제)
점 네 개의 좌표를 담은 이차원 배열 dots가 다음과 같이 매개변수로 주어집니다.
- [[x1, y1], [x2, y2], [x3, y3], [x4, y4]]
주어진 네 개의 점을 두 개씩 이었을 때, 두 직선이 평행이 되는 경우가 있으면 1을 없으면 0을 return 하도록 solution 함수를 완성해보세요.
내가 작성한 답안)
const solution = (dots) => {
//22-11-17
//0. 두 점을 이어 만든 선분의 기울기를 구해 기울기를 비교한다.
//1-A. 기울기가 같을 경우
//1-A-1. 평행이므로 1을 return
//1-B. 기울기가 다를 경우
//1-B-1. 평행이 아니므로 0을 return
const resultArr = [];
const getInclination = (line1, line2) => { return Math.abs(line1[1] - line2[1]) / Math.abs(line1[0] - line2[0]) }
const calcPair = [[0, 1, 2, 3], [0, 2, 1, 3], [1, 2, 0, 3], [1, 3, 0, 2]]
calcPair.map(it => {
const smResult1 = getInclination(dots[it[0]], dots[it[1]]);
const smResult2 = getInclination(dots[it[2]], dots[it[3]]);
smResult1 === smResult2 ? resultArr.push(1) : false;
})
return resultArr.length ? 1 : 0;
}
* 원래는 dots의 원소끼리 뺀 뒤 그 값이 같을 경우 평행이라고 가정하고 코드를 작성하였는데, 오류가 발생하였다. 질문하기에서 힌트를 얻은 결과 점들의 차이가 아닌, 두 선분의 기울기를 계산해야했다.