레벨 0
문제라고 얕보면 큰 코 다침 파트1
길이가 얼마 되지않는다면 무작정 세는 것이 답일 수 있다. 이 문제는 주어진 배열의 길이가 4밖에 되지 않기에...거기에 또 2개를 뽑아서 선분을 만들어서 기울기를 통해서 접근하는 것이기에 경우의 수는 더 적어진다. 그럼에도 어려웠던 이유는 문제가 명확하지 않았기 때문인 것 같다. 그러나 좀 더 샤프하게 문제를 읽었다면 내가 무엇을 잘못생각했는지를 더 빠르게 캐취할 수 있었을 것 같다. 그럼 노가다를 좀 덜했을 수도... 왜 이런 생각을 하게 되었는지 이제부터 설명해보겠다.
function solution(dots) {
const slopes = [];
for (let i = 0; i < dots.length - 1; i++) {
const [x1, y1] = dots[i];
for (let j = i + 1; j < dots.length; j++) {
const [x2, y2] = dots[j];
const s = (y2 - y1) / (x2 - x1);
slopes.push(s);
}
}
return slopes.length === new Set(slopes).size ? 0 : 1;
}
처음에 이 문제를 이해한바는 이렇다. 4개의 점에서 2개씩을 뽑아서 선분을 만들수 있는 경우의 수는 조합 4C2
로 보면 6가지의 경우의 수이고 각각 선분의 기울기를 비교하여 같은게 나온다면 1을, 끝까지 순회가 이루어진다면 0을 반환하도록 코드를 작성하였다. 이러한 아이디어를 코드를 구현하였다. 위 코드는 Set을 이용한 것이지, 사실 순회하면서 바로 비교를 통해서 리턴하는 코드도 있었다.
제출! 하지만, 12번부터 모두 오류?! 띠옹?? 뭐지?? 뭐가 잘못된거지?? 한참을 고민하였고 도저히 이해가 안되서 힌트를 통해서 한가지 반례를 알게 되었다. 그러나... 그게 함정이였다.
INPUT : [[1, 1], [4, 2], [5, 5], [7, 7]]
OUTPUT : 1 → 🤬
이모지처럼 이건 1이 아니다. 0이다.
위 코드는 위 예시 역시 통과하지만 역시나 제출하면 변함이 없었다. 그러다가 내가 뭔가 잘못 생각한 것인가 하는 생각에 문제를 몇 번이고 다시 읽어보았다. 그래서 이런 예상을 해보았다.
INPUT - [ A, B, C, D] (간단하게 좌표를 알파벳으로 표현) 이렇다고 가정 하면,
A와 B를 뽑아서 선분을 만들면, 당연히 나머지 선분은 C와 D로 만들 수밖에 없다. 같은 원리로, A-C/B-D, A-D/B-C 이렇게 총 3가지의 경우 수
밖에 없다. 그런데 위에 코드는 A-B를 만들때, A-C or A-D도 만들 수 있는 것처럼 비교가 되고 있었다. 그래서 나의 예상대로 코드를 구현해보았더니... 자꾸 위의 함정 반례에서 오류가 뜨는 것이였다. 철석같이 저 답을 의심없이 믿고 있었던 내 잘못이긴하다, 반례를 좀 더 비판적인 사고로 받아드렸어야 했다.
그리고 또 한가지는 위에서 말한 것처럼 내가 비교해야할 조건이 3가지밖에 되지않는다. 이걸 규칙성을 어떻게든 찾겠다고 for문을 돌리고 조건을 넣고 했더니 코드가 훨씬 복잡해졌다. 차라리 아래 코드처럼 조건문 3가지로 비교하는 편이 훨씬 좋은 코드라고 생각한다.
function solution(dots) {
const [x1, y1] = dots[0];
const [x2, y2] = dots[1];
const [x3, y3] = dots[2];
const [x4, y4] = dots[3];
if ((y1 - y2) / (x1 - x2) === (y3 - y4) / (x3 - x4)) return 1;
if ((y1 - y3) / (x1 - x3) === (y2 - y4) / (x2 - x4)) return 1;
if ((y1 - y4) / (x1 - x4) === (y2 - y3) / (x2 - x3)) return 1;
return 0;
}
여러가지 주위의 헷갈림(문제의 부정확함 + 잘못된 반례) + 굳이 규칙성을 찾겠다고한 나의 잘못된 선택 + 비판적사고 결여...등등을 통해서 레벨0임에도 레벨2의 난이도로 문제를 풀게 되었다. 기울기를 이용하여 문제를 접근한다는 아이디어 자체는 틀린 것이 아니라서 다행이긴하다. 끝까지 답을 내는 과정에서 사고가 있었을뿐...이라고 위로를 한다. 😅