
내가 생각했을때 문제에서 원하는부분
점 네 개의 좌표를 담은 이차원 배열 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;
}
}
위에 있는 코드를 변경한 코드
코드와 설명이 부족할수 있습니다. 코드를 보시고 문제가 있거나 코드 개선이 필요한 부분이 있다면 댓글로 말해주시면 감사한 마음으로 참고해 코드를 수정 하겠습니다.