알고리즘 문제 풀이 - 평행

0

TIL

목록 보기
105/126

점 네 개의 좌표를 담은 이차원 배열 dots가 다음과 같이 매개변수로 주어집니다.
주어진 네 개의 점을 두 개씩 이었을 때, 두 직선이 평행이 되는 경우가 있으면 1을 없으면 0을 return 하도록 solution 함수를 완성해보세요.

  • [[x1, y1], [x2, y2], [x3, y3], [x4, y4]]

풀이의 방향성을 잡기 위해
우선 각 4개의 좌표에서 두 선을 이었을 때의 기울기를 구하고,
그 중 같은 것이 있다면 1을 반환하도록 해보기로 했는데
생각해보니 /를 사용하면 나머지는 버려지므로 정확한 비교가 어렵다고 판단되어 double을 사용해보기로 했다.

public int solution(int[][] dots) {
    int answer = 0;
    int x1 = dots[0][0];
    int y1 = dots[0][1];
    int x2 = dots[1][0];
    int y2 = dots[1][1];
    int x3 = dots[2][0];
    int y3 = dots[2][1];
    int x4 = dots[3][0];
    int y4 = dots[3][1];

    double slope1 = (double) (y2 - y1) / (x2 - x1);
    double slope2 = (double) (y4 - y3) / (x4 - x3);
    double slope3 = (double) (y3 - y1) / (x3 - x1);
    double slope4 = (double) (y4 - y2) / (x4 - x2);

    if (slope1 == slope2 || slope1 == slope3 || slope1 == slope4 || slope2 == slope3 || slope2 == slope4 || slope3 == slope4) {
        answer = 1;
    } else {
        answer = 0;
    }

    return answer;
}

그런데 테스트 케이스 12번부터 17번까지 쭉 틀려버렸다.

이해가 되지않아 구글에 검색을 해보니 프로그래머스 질문 글에

12번 케이스부터 틀린다고 말씀하시는 분들이 많고 저 역시 같은 곳에서 오래 헤맸기 때문에 글 올립니다.
개인적인 의견은 문제 출제자분께서 조금 더 명확하게 문제를 설명하지 않았기 때문에 생긴 상황이라고 생각합니다.

4개의 점을 각각 a,b,c,d라고 했을 때, 12번 케이스부터 틀리신 분들은 아마 아래와 같은 6가지 경우의 수를 생각하셨을 겁니다.

a-b, a-c, a-d, b-c, b-d, c-d

그런데 문제에 적혀있는 '주어진 네 개의 점을 두 개씩 이었을 때'를 다시 잘 곱씹어보면서 혹시 아래와 같은 3가지 경우의 수 만을 의미하는게 아닌가 하고 코드를 처음부터 다시 짜보았고 통과했습니다.

[a-b, c-d],[a-c, b-d],[a-d, b-c]

즉, 4개의 점들로 임의의 두 쌍을 만들었을 때 그 두 쌍이 이루는 직선이 서로 평행한지를 묻는 문제였습니다.

https://school.programmers.co.kr/questions/44837

선분의 꼭지점의 좌표가 중복될 수 없다는 내용이었다.

public int solution(int[][] dots) {
    int answer = 0;
    int x1 = dots[0][0];
    int y1 = dots[0][1];
    int x2 = dots[1][0];
    int y2 = dots[1][1];
    int x3 = dots[2][0];
    int y3 = dots[2][1];
    int x4 = dots[3][0];
    int y4 = dots[3][1];

    double slope1 = (double) (y2 - y1) / (x2 - x1);
    double slope2 = (double) (y4 - y3) / (x4 - x3);
    double slope3 = (double) (y3 - y1) / (x3 - x1);
    double slope4 = (double) (y4 - y2) / (x4 - x2);
    double slope5 = (double) (y4 - y1) / (x4 - x1);
    double slope6 = (double) (y3 - y2) / (x3 - x2);

    if (slope1 == slope2 || slope3 == slope4 || slope5 == slope6) {
        answer = 1;
    } else {
        answer = 0;
    }

    return answer;
}

-> 성공

0개의 댓글