문제
점 네 개의 좌표를 담은 이차원 배열 dots가 다음과 같이 매개변수로 주어집니다.
[[x1, y1], [x2, y2], [x3, y3], [x4, y4]]
주어진 네 개의 점을 두 개씩 이었을 때, 두 직선이 평행이 되는 경우가 있으면 1을 없으면 0을 return 하도록 solution 함수를 완성해보세요.
틀린 풀이
해당 풀이는 기울기가 같고 y절편이 다른 값은 찾아주지만
결국엔 이어지지않은 같은 그래프의 평행 선을 찾아주지 못해서 틀린 답
이어지지않는 값을 객체로 따로 저장해서 찾을까 싶었지만 이미 저장된 map때문에
이후에 중복되지 않은 것을 찾을 수 없어 방향성이 틀린 것을 파악
import java.util.*;
class Solution {
public int solution(int[][] dots) {
int answer = 0;
// 기울기
// int a = (y2 - y1)/(x2- x1)
Map<Double, Double> leanMap = new HashMap<>();
for(int i=0; i<dots.length; i++){
int num = i+1;
int x1 = dots[i][0];
int y1 = dots[i][1];
while(num<dots.length){
int x2 = dots[num][0];
int y2 = dots[num][1];
double lean = (double)(y2 - y1)/(double)(x2- x1);
double y = y2 - lean*x2; // y절편
if(leanMap.containsKey(lean)&&leanMap.get(lean)!=y){ // 기울기가 같고, 한 그래프선에 겹치지않을 때
return 1;
} else {
leanMap.put(lean,y);
}
num++;
}
}
return answer;
}
}
맞은 풀이
반복문은 1-4 1-3이랑 연결된 선도 찾기 때문에 옳은 방법이 아니라 직접 계산해야함!
나올 수 있는 경우의 수가 3가지이므로 나눠서 계산하였다
class Solution {
public int solution(int[][] dots) {
int answer = 0;
int x1 = dots[0][0];
int y1 = dots[0][1];
int x2 = dots[1][0];
int y2 = dots[1][1];
int x3 = dots[2][0];
int y3 = dots[2][1];
int x4 = dots[3][0];
int y4 = dots[3][1];
// 1-2 / 3-4
double lean1 = (double)(y2-y1)/(x2-x1);
double lean2 = (double)(y4-y3)/(x4-x3);
if(lean1==lean2) return 1;
// 1-3 / 2-4
lean1 = (double)(y3-y1)/(x3-x1);
lean2 = (double)(y4-y2)/(x4-x2);
if(lean1==lean2) return 1;
// 1-4 / 2-3
lean1 = (double)(y4-y1)/(x4-x1);
lean2 = (double)(y3-y2)/(x3-x2);
if(lean1==lean2) return 1;
return answer;
}
}
풀이를 조금 참고하긴 했지만 결국엔 단순하게 알아볼 수 있는 풀이가 젤 이상적인것같다
'programmers' 카테고리의 다른 글
[JAVA] ☆연속된 수의 합 (0) | 2024.06.27 |
---|---|
[JAVA] 이진수 더하기 - Integer.toBinaryString() (0) | 2024.06.27 |
[JAVA] 겹치는 선분의 길이 (0) | 2024.06.27 |
[JAVA] 배열 조각하기 - Arrays.copyOfRange() (0) | 2024.06.26 |
[JAVA] 접미사 배열 - 정렬 (0) | 2024.06.24 |