문제
나의 생각
해당문제에서 문제가 된 부분은 평행이라는 것을 어떻게 확인하냐에 대한 문제였다.
그래서 직선의 기울기를 구하는 공식을 따로 공부를 하고 접근을 했다.
초반 접근은 기울기 공식으로 나오는 값을 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 |