프로그래머스 평행

KIMYEONGJUN·2026년 9월 25일
post-thumbnail

문제

내가 생각했을때 문제에서 원하는부분

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

내가 이 문제를 보고 생각해본 부분

4개의 점을 두 개씩 짝지을 수 있는 총 3가지 조합을 차례대로 확인한다.
첫 번째 조건문은 (0번, 1번 점)과 (2번, 3번 점)을 묶어서 평행한지 검사한다.
두 번째 조건문은 (0번, 2번 점)과 (1번, 3번 점)을 묶어서 평행한지 검사한다.
세 번째 조건문은 (0번, 3번 점)과 (1번, 2번 점)을 묶어서 평행한지 검사한다.
3가지 조합 중 단 하나라도 평행하다면 즉시 1을 반환하고 종료한다.
모든 조합을 확인했음에도 평행한 직선이 없다면 최종적으로 0을 반환한다.
두 직선의 기울기가 서로 같은지 비교하는 함수이다.
첫 번째 직선의 x 증가량(dx1)과 y 증가량(dy1)을 구한다.
두 번째 직선의 x 증가량(dx2)과 y 증가량(dy2)을 구한다.
컴퓨터에서 나눗셈을 사용하면 소수점 오차가 발생하거나 분모가 0이 될 때 오류가 생길 수 있다.
이를 방지하기 위해 나누기 대신 대각선 곱셈 형태인 dy1 * dx2 == dy2 * dx1 수식을 사용한다.
두 직선의 기울기가 같다면 true를 반환하고, 다르면 false를 반환한다.

코드로 구현

class Solution {
    public int solution(int[][] dots) {
        if (isParallel(dots[0], dots[1], dots[2], dots[3])) {
            return 1;
        }

        if (isParallel(dots[0], dots[2], dots[1], dots[3])) {
            return 1;
        }

        if (isParallel(dots[0], dots[3], dots[1], dots[2])) {
            return 1;
        }

        return 0;
    }

    private boolean isParallel(int[] p1, int[] p2, int[] p3, int[] p4) {
        int dx1 = p2[0] - p1[0];
        int dy1 = p2[1] - p1[1];
        int dx2 = p4[0] - p3[0];
        int dy2 = p4[1] - p3[1];
        return dy1 * dx2 == dy2 * dx1;
    }
}

프로그래머스 코드

package programmers.programmers2;

// 프로그래머스 평행
public class Main153 {
    public static void main(String[] args) {
        // 테스트 케이스 확인용
        Solution7 sol = new Solution7();

        int[][] dots1 = {{1, 4}, {9, 2}, {3, 8}, {11, 6}};
        int[][] dots2 = {{3, 5}, {4, 1}, {2, 4}, {5, 10}};

        System.out.println(sol.solution(dots1)); // 예상 결과: 1
        System.out.println(sol.solution(dots2)); // 예상 결과: 0
    }
}

class Solution7 {
    public int solution(int[][] dots) {
        if (isParallel(dots[0], dots[1], dots[2], dots[3])) {
            return 1;
        }

        if (isParallel(dots[0], dots[2], dots[1], dots[3])) {
            return 1;
        }

        if (isParallel(dots[0], dots[3], dots[1], dots[2])) {
            return 1;
        }

        return 0;
    }

    private boolean isParallel(int[] p1, int[] p2, int[] p3, int[] p4) {
        int dx1 = p2[0] - p1[0];
        int dy1 = p2[1] - p1[1];
        int dx2 = p4[0] - p3[0];
        int dy2 = p4[1] - p3[1];
        return dy1 * dx2 == dy2 * dx1;
    }
}

위에 있는 코드를 변경한 코드

마무리

코드와 설명이 부족할수 있습니다. 코드를 보시고 문제가 있거나 코드 개선이 필요한 부분이 있다면 댓글로 말해주시면 감사한 마음으로 참고해 코드를 수정 하겠습니다.

profile
Junior backend developer

0개의 댓글