[프로그래머스/Java] Lv.0 평행

febCho·2024년 5월 31일
0

코딩테스트

목록 보기
210/253
post-thumbnail

문제

점 네 개의 좌표를 담은 이차원 배열 dots가 다음과 같이 매개변수로 주어집니다.

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

주어진 네 개의 점을 두 개씩 이었을 때, 두 직선이 평행이 되는 경우가 있으면 1을 없으면 0을 return 하도록 solution 함수를 완성해보세요.

- 제한사항

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

풀이

네 개의 점을 두 개씩 전부 이어보며 두 직선이 평행이 되는 경우 1을 반환해야 한다. 이에 필요한 총 경우의 수는 6이며 그때마다 점을 이어 만든 선분 2개의 기울기를 구해야 한다. 이에 최대 12번의 기울기 공식 계산이 필요해 계산 과정을 함수로 만들어 재사용하기로 했다.

다음으로는 for문으로 루프를 돌며 dots의 요소들을 비교해 주는데, 이때 반복자인 i와 j를 인덱스로 갖는 dots의 요소를 함수에 대입한다. 함수에서는 인자로 받은 두 1차원 배열을 받아 0번 인덱스와 1번 인덱스에 해당하는 x, y 값을 각 변수에 저장한다. 그 후 return 시 기울기 공식에 따라 값을 계산 후 반환한다. 주의할 점은 '정수 / 정수 = 정수'이므로 (double)로 캐스팅을 해주어야 한다는 점.

기울기 : y 증가량 / x 증가량 = (y2 - y1) / (x2 - x1)

함수 실행의 결과로 반환 받은 double 타입의 기울기를 slope1 변수에 저장한다. 다음으로는 선택한 두 점 외 나머지 두 점에 해당하는 기울기를 구하기 위해 for문을 다시 만들어 준다. 이때, 이미 선택한 점을 선택하지 않기 위해 if(k == j) continue; 그리고 if(l == i || l == j) continue;로 제외해 준다.

나머지 두 점으로 구한 기울기의 경우 slope2 변수에 저장하고, 이 둘이 같다면 answer에 1을 대입해 준 뒤, 메모리 절약을 위해 break;로 빠져나온다.

public class Solution {
    private double slope(int[] dot1, int[] dot2) {
        int x1 = dot1[0];
        int y1 = dot1[1];
        int x2 = dot2[0];
        int y2 = dot2[1];
        return (double)(y2 - y1) / (x2 - x1);
    }
    
    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++){
                double slope1 = slope(dots[i], dots[j]);
                
                for(int k=i+1; k<dots.length; k++){
                    if(k == j) continue;
                    
                    for(int l=k+1; l<dots.length; l++){
                        if(l == i || l == j) continue;
                        
                        double slope2 = slope(dots[k], dots[l]);
                        if(slope1 == slope2){
                            answer = 1;
                            break;
                        }
                    }
                }
            }
        }
        return answer;
    }
}

결과

profile
Done is better than perfect.

0개의 댓글