📕 문제 설명
점 네 개의 좌표를 담은 이차원 배열 dots가 다음과 같이 매개변수로 주어집니다.
[[x1, y1], [x2, y2], [x3, y3], [x4, y4]]
주어진 네 개의 점을 두 개씩 이었을 때, 두 직선이 평행이 되는 경우가 있으면 1을 없으면 0을 return 하도록 solution 함수를 완성해보세요.
⭐ 제한사항
- dots의 길이 = 4
- dots의 원소는 [x, y] 형태이며 x, y는 정수입니다.
- 0 ≤ x, y ≤ 100
- 서로 다른 두개 이상의 점이 겹치는 경우는 없습니다.
- 두 직선이 겹치는 경우(일치하는 경우)에도 1을 return 해주세요.
- 임의의 두 점을 이은 직선이 x축 또는 y축과 평행한 경우는 주어지지 않습니다.
💻 입출력 예
dots | result |
[[1, 4], [9, 2], [3, 8], [11, 6]] | 1 |
[[3, 5], [4, 1], [2, 4], [5, 10]] | 0 |
📚 입출력 예 설명
입출력 예 #1
- 점 [1, 4], [3, 8]을 잇고 [9, 2], [11, 6]를 이으면 두 선분은 평행합니다.
입출력 예 #2
- 점을 어떻게 연결해도 평행하지 않습니다.
😊 나의 답변
function solution(dots) {
const arr = [];
for(let i = 0 ; i < dots.length ; i++) {
for(let j = i + 1 ; j < dots.length ; j++) {
const value = (dots[i][1] - dots[j][1]) / (dots[i][0] - dots[j][0]);
if(arr.includes(value)) return 1;
arr.push(value);
}
}
return 0;
}
예전에는 통과됐을 코드인데 테스트케이스 12~17번이 모조리 틀려버린다.
다시.. 해보자
function solution(dots) {
const arr = [];
const cnt = new Map();
arr.push(dots[0][1] - dots[1][1] / dots[0][0] - dots[1][0]);
arr.push(dots[0][1] - dots[2][1] / dots[0][0] - dots[2][0]);
arr.push(dots[0][1] - dots[3][1] / dots[0][0] - dots[3][0]);
arr.push(dots[1][1] - dots[2][1] / dots[1][0] - dots[2][0]);
arr.push(dots[1][1] - dots[3][1] / dots[1][0] - dots[3][0]);
arr.push(dots[2][1] - dots[3][1] / dots[2][0] - dots[3][0]);
arr.forEach((v) => cnt.set(v, (cnt.get(v) || 0) + 1));
return arr.filter((v) => cnt.get(v) !== 1).length > 0 ? 1 : 0;
}
두 번째 노가다는 1, 6, 10, 11번 오답으로 정확성 76.5로 실패...
다시 해보자 🤦♀️
function solution(dots) {
// 기울기 : y축의 변화량 / x축의 변화량
// 기울기가 같으면 평행하는 것
const arrX = [];
const arrY = [];
const arr = [];
const x = dots.map(([x, _]) => x);
const y = dots.map(([_, y]) => y);
x.forEach((v, i) => arrX.push(v - x[i+1]));
y.forEach((v, i) => arrY.push(v - y[i+1]));
arrX.forEach((_, i) => arr.push(arrY[i] / arrX[i]));
return new Set(arr).size !== arr.length ? 1 : 0;
}
세 번째 시도... 5, 14, 15, 17번 실패로 76.5...
다시 해보자... 😂
⭐ 진짜 정답
function solution(dots) {
const [[x1, y1], [x2, y2], [x3, y3], [x4, y4]] = dots;
// 1 - 2, 3 - 4
if((y1 - y2) / (x1 - x2) === (y3 - y4) / (x3 - x4)) return 1;
// 1 - 3, 2 - 4
if((y1 - y3) / (x1 - x3) === (y2 - y4) / (x2 - x4)) return 1;
// 1 - 4, 2 - 3
if((y1 - y4) / (x1 - x4) === (y2 - y3) / (x2 - x3)) return 1;
return 0;
}
마음을 다잡고 다시 생각해보았다.
다 지우고 문제를 다시 읽다보니 세 번의 비교만 하면 됐다. if문으로 세 개의 조건을 비교해준다.
1️⃣ 점1, 점2를 연결한 선분과 점3, 점4를 연결한 선분의 기울기 비교
2️⃣ 점1, 점3을 연결한 선분과 점2, 점4를 연결한 선분의 기울기 비교
3️⃣ 점1, 점4를 연결한 선분과 점2, 점3을 연결한 선분의 기울기 비교
뭔가 네번째 시도에는 술술 풀렸고, 약간 허무하게(?) 성공해버렸다. 심플 is 베스트인가
하지만 시행착오를 겪으며 여러가지 생각과 시도를 해볼 수 있었던... 유의미한 시간이었다 😂
채점 이후 다른 사람의 답변을 봐도 하드코딩이 많았다. 암튼 뿌듯해!
728x90
반응형
'프로그래머스 > Lv. 0 코딩테스트 입문' 카테고리의 다른 글
[프로그래머스] Lv. 0 코딩테스트 입문 100문제 풀이 완료! (0) | 2023.08.28 |
---|---|
[프로그래머스] Lv.0 짝수 홀수 개수 / JS (0) | 2023.08.28 |
[프로그래머스] Lv.0 문자 반복 출력하기 / JS (0) | 2023.08.28 |
[프로그래머스] Lv.0 특정 문자 제거하기 / JS (0) | 2023.08.28 |
[프로그래머스] Lv.0 각도기 / JS (0) | 2023.08.28 |