[프로그래머스][JAVA] 평행

Boknami·2023년 8월 2일
0

프로그래머스

목록 보기
12/29

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

🕐 풀이 시간 : 45분 정도

🌄시행착오

문제를 풀기 전 테스트케이스를 통해서 해당 문제에서 확인할 수 있는 반복되는 특징? 같은 걸 찾아보니 'x좌표끼리의 차이, y좌표끼리의 차이가 같은 경우'에 답이 나오는 것 같았다. 그래서 해당 내용을 코드로 옮겼지만 정답이 나오지 않았다.
고민하다가 반례를 ChatGPT에 문의했는데

이런 식의 경우에 평행하다고 나올 수 있기에 코드를 전체적으로 수정할 것을 권해주었다.

💡아이디어

평행을 하려면 내가 생각한 x,y간의 좌표 값의 차이보다 사실상 기울기를 사용하면 훨씬 좋다..잡고 고민을 하다가 그냥 이건 평행이라는 것을 좋은 방식으로 한 번 푸는 게 나을 것 같아서 서칭을 하니 기울기라는 것이 나왔다.

주어지는 것이 4개뿐이니 조합할 수 있는 것들을 모두 조합한다.
1. 1,2 vs 3,4
2. 1,3 vs 2,4
3. 1,4 vs 2,3

이렇게 3개의 경우에 대해서 기울기를 모두 구하고 정상적인 경우에는 1을 반환할 수 있게 한다.

🙄틀린코드

// 1,4 3,8
// 9,2 11,6
// x좌표끼리의 차이, y좌표끼리의 차이가 같은 경우에
// 즉 2개씩 경우를 조합하며?..
class Solution {
    public int solution(int[][] dots) {
        int answer = 0;
        if(Math.abs(dots[0][0] - dots[1][0]) == Math.abs(dots[2][0] - dots[3][0])){
            if(Math.abs(dots[0][1] - dots[1][1]) == Math.abs(dots[2][1] - dots[3][1]) ){
                answer = 1;
            }
        }
        
        if(Math.abs(dots[0][0] - dots[2][0]) == Math.abs(dots[1][0] - dots[3][0])){
            if(Math.abs(dots[0][1] - dots[2][1]) == Math.abs(dots[1][1] - dots[3][1]) ){
                answer = 1;
            }
        }
        
        if(Math.abs(dots[0][0] - dots[3][0]) == Math.abs(dots[2][0] - dots[1][0])){
            if(Math.abs(dots[0][1] - dots[3][1]) == Math.abs(dots[2][1] - dots[1][1]) ){
                answer = 1;
            }
        }
        return answer;
    }
}

😊정답코드

class Solution {
    public int solution(int[][] dots) {
        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];
        int answer = 0;
        
        double slope1 = (double) (y2 - y1) / (x2 - x1);
        double slope2 = (double) (y4 - y3) / (x4 - x3);
        if (slope1 == slope2) answer = 1;
        
        slope1 = (double) (y3 - y1) / (x3 - x1);
        slope2 = (double) (y2 - y4) / (x2 - x4);
        if (slope1 == slope2) answer = 1;
        
        slope1 = (double) (y4 - y1) / (x4 - x1);
        slope2 = (double) (y2 - y3) / (x2 - x3);
        if (slope1 == slope2) answer = 1;
        
        return answer;
    }
}

0개의 댓글

관련 채용 정보