평행

문제


나의 생각

해당문제에서 문제가 된 부분은 평행이라는 것을 어떻게 확인하냐에 대한 문제였다.

그래서 직선의 기울기를 구하는 공식을 따로 공부를 하고 접근을 했다. 

초반 접근은 기울기 공식으로 나오는 값을 List로 담아서 contains로 있다면 1 없다면 0이라는 값으로 접근. 


나의 답안

아래의 답을 제출하였는데 테스트 12번 부터 다 실패가 뜨기 시작했다. 

public static int solution(int[][] dots) {
    ArrayList<Double> a = new ArrayList<>();
    for (int i = 0; i < dots.length-1; i++) {
        for (int j = i+1; j < dots.length; j++) {
            double b =  ((double)dots[i][1] - dots[j][1] / dots[i][0] - dots[j][0]);
            if (a.contains(b)){
                return 1;
            } else {
                a.add(b);
            }
        }
    }

    return 0;
}

해당 문제에 대해서 알아보기 위해 질문하기로 가니 비슷한 케이스가 많아서 사람들이 이미 질문을 해놓은 것을 볼 수 있었다. 

답변에서 말해주고 있는 것은 하나의 케이스 마다 모든 케이스를 비교하는 것이 아닌, 정해진 좌표들의 기준으로 차집합의 기준으로 평행을 구하여야 한다는 말을 하고 있다. 즉, 복수케이스(같은 케이스)는 무시하라는 뜻 이었다. 해당 질문을 바탕으로 바뀐 답은 아래와 같다. 

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

    if (((double) (dots[0][0] - dots[1][0]) / (dots[0][1] - dots[1][1]))
            == ((double) (dots[2][0] - dots[3][0]) / (dots[2][1] - dots[3][1]))) {
        return 1;
    }
    if (((double) (dots[0][0] - dots[2][0]) / (dots[0][1] - dots[2][1]))
            == ((double) (dots[1][0] - dots[3][0]) / (dots[1][1] - dots[3][1]))) {
        return 1;
    }
    if (((double) (dots[0][0] - dots[3][0]) / (dots[0][1] - dots[3][1]))
            == ((double) (dots[2][0] - dots[1][0]) / (dots[2][1] - dots[1][1]))) {
        return 1;
    }
    return answer;
}

공부한 내용

수학공부를 하고온 느낌이지만 직선의 기울기를 구하는 공식은 아래와 같다. 

m = y2 - y1 / x2 - x1 

'Programmers 문제풀이 > Lv.0' 카테고리의 다른 글

구슬을 나누는 경우의 수  (0) 2023.03.06
최빈값 구하기  (0) 2023.03.06
문자열 계산하기  (0) 2023.03.06
잘라서 배열로 저장하기  (0) 2023.03.06
컨트롤 제트  (0) 2023.03.05