본문 바로가기
Coding Test/Java Coding Test

[프로그래머스 / 자바] - 평행

by nam_ji 2024. 10. 10.

평행 - LV.0

문제점 

  • 2차원 정수 배열 dots가 매개변수로 주어집니다.
  • 네 개의 좌표를 담은 이차원 배열 dots가 다음과 같이 매개변수로 주어집니다.
    • [[x1, y1], [x2, y2], [x3, y3], [x4, y4]]
  • 주어진 네 개의 점을 두 개씩 이었을 때,
  • 두 직선이 평행이 되는 경우가 있으면 1을 없으면 0을 출력하는 문제입니다.


테스트 (인텔리제이)

  • 평을 찾으라는 의미는 두 직성의 기울기가 동일한 것을 찾으라는 의미입니다.
  • 기울기의 공식은 아래와 같고
  • 평행을 구하는 공식은 아래와 같습니다.
  • 우선 첫 번째 공식은 네 개의 점의 모든 경우를 탐색하는 방법입니다.
    • 네 개의 점 중 두개를 선택하여 첫 번째 직선을 만들고, 남은 두 점으로 두 번쨰 직선을 만드는 모든 경우를 탐색합니다.
    • 첫 번째 직선을 이루는 두 직선을 i, j가 구성하고
    • 두 번째 직선을 이루는 두 직선을 k, l가 구성합니다.
    • 동일한 점이 선택되지 않도록 i와 k,l, j와 k,l이 같지 않을 때라는 조건의 if문을 만들어줍니다.
    • 위 공식을 이용하여 기울기를 비교하고 같다면 answer에 1로 설정하고 break를 이용하여 반복문을 종료합니다.
    • 여기서 중요한 점은 for문이 4개 사용되었기 때문에 각각의 for문에 if문으로 answer가 1이면 break를 걸어줍니다.
    • 이렇게 문제를 해결했습니다.
  • 두 번째 공식은 네 개의 점 중 특정 3가지 조합만을 선택하여 평행 여부를 판단합니다.
    • 점 0,1과 점 2,3을 이용한 직선
    • 점 0,2와 점 1,3을 이용한 직선
    • 점 0,3과 점 1,2를 이용한 직선
    • 이 조건들로 위 기울기 비교 공식을 사용합니다.
    • 세가지 조건 중 하나라도 충족한다면 answer에 1을 설정해주면 해결할 수 있습니다.
package com.namji.codingtest;

public class 평행 {
  public static void main(String[] args) {
    /*
    점 네 개의 좌표를 담은 이차원 배열 dots가 다음과 같이 매개변수로 주어집니다.
    - [[x1, y1], [x2, y2], [x3, y3], [x4, y4]]
    주어진 네 개의 점을 두 개씩 이었을 때,
    두 직선이 평행이 되는 경우가 있으면 1을 없으면 0을 출력하는 문제입니다.

    제한사항
    - dots의 길이 = 4
    - dots의 원소는 [x, y] 형태이며 x, y는 정수입니다.
      - 0 ≤ x, y ≤ 100
    - 서로 다른 두개 이상의 점이 겹치는 경우는 없습니다.
    - 두 직선이 겹치는 경우(일치하는 경우)에도 1을 return 해주세요.
    - 임의의 두 점을 이은 직선이 x축 또는 y축과 평행한 경우는 주어지지 않습니다.

    입출력 예
    dots	                            result
    [[1, 4], [9, 2], [3, 8], [11, 6]]	1
    [[3, 5], [4, 1], [2, 4], [5, 10]]	0

    입출력 예 설명
    #1
    - 점 [1, 4], [3, 8]을 잇고 [9, 2], [11, 6]를 이으면 두 선분은 평행합니다.
    #2
    - 점을 어떻게 연결해도 평행하지 않습니다.
     */
    int[][] dots = {{1, 4}, {9, 2}, {3, 8}, {11, 6}};

    solution1(dots);
    solution2(dots);
  }

  public static void solution1(int[][] dots) {
    int answer = 0;

    for (int i = 0; i < dots.length; i++) {
      for (int j = i + 1; j < dots.length; j++) {
        for (int k = 0; k < dots.length; k++) {
          for (int l = k + 1; l < dots.length; l++) {
            if (i != k && i != l && j != k && j != l) {
              if ((dots[j][1] - dots[i][1]) * (dots[l][0] - dots[k][0]) == (dots[l][1] - dots[k][1]) * (dots[j][0] - dots[i][0])) {
                answer = 1;
                break;
              }
            }
          }
          if (answer == 1) {
            break;
          }
        }
        if (answer == 1) {
          break;
        }
      }
      if (answer == 1) {
        break;
      }
    }

    System.out.println(answer);
  }

  public static void solution2(int[][] dots) {
    int answer = 0;

    if (parallel(0, 1, 2, 3, dots) ||
        parallel(0, 2, 1, 3, dots) ||
        parallel(0, 3, 1, 2, dots)) {
      answer = 1;
    }

    System.out.println(answer);
  }

  private static boolean parallel(int a, int b, int c, int d, int[][] dots) {
    int x = (dots[a][0] - dots[b][0]) * (dots[c][1] - dots[d][1]);
    int y = (dots[a][1] - dots[b][1]) * (dots[c][0] - dots[d][0]);

    return x == y; // 기울기가 같은지 확인
  }
}

프로그래머스 코드

import java.util.*;

class Solution {
    public int solution(int[][] dots) {
        int answer = 0;

        for (int i = 0; i < dots.length; i++) {
            for (int j = i + 1; j < dots.length; j++) {
                for (int k = 0; k < dots.length; k++) {
                    for (int l = k + 1; l < dots.length; l++) {
                        if (i != k && i != l && j != k && j != l) {
                            if ((dots[j][1] - dots[i][1]) * (dots[l][0] - dots[k][0]) == (dots[l][1] - dots[k][1]) * (dots[j][0] - dots[i][0])) {
                                answer = 1;
                                break;
                            }
                        }
                    }
                    if (answer == 1) {
                        break;
                    }
                }
                if (answer == 1) {
                    break;
                }
            }
            if (answer == 1) {
                break;
            }
        }
        
        return answer;
    }
}

// import java.util.*;

// class Solution {
//     public int solution(int[][] dots) {
//         int answer = 0;
        
//         if (parallel(0, 1, 2, 3, dots) ||
//             parallel(0, 2, 1, 3, dots) ||
//             parallel(0, 3, 1, 2, dots)) {
//             answer = 1;
//         }
        
//         return answer;
//     }
    
//     private static boolean parallel(int a, int b, int c, int d, int[][] dots) {
//     int x = (dots[a][0] - dots[b][0]) * (dots[c][1] - dots[d][1]);
//     int y = (dots[a][1] - dots[b][1]) * (dots[c][0] - dots[d][0]);

//     return x == y; // 기울기가 같은지 확인
//   }
// }