Leetcode Java Number of Boomerangs
업데이트:
문제
코드
class Solution {
public int numberOfBoomerangs(int[][] points) {
int number = 0;
Map<Integer, Integer> map = new HashMap<>();
for (int i = 0; i < points.length; i++) {
for (int j = 0; j < points.length; j++) {
if (i == j) {
continue;
}
int distance = this.calculateDistance(points[i], points[j]);
int point = map.getOrDefault(distance, 0);
if (point > 0) {
number += point * 2;
}
map.put(distance, point + 1);
}
map.clear();
}
return number;
}
private int calculateDistance(int[] pointA, int[] pointB) {
int x = pointB[0] - pointA[0];
int y = pointB[1] - pointA[1];
return (x * x) + (y * y);
}
}
결과
설명
- 평면 위에 존재하는 points를 이용하여 point(i, j, k)에서 i와 j 사이의 거리가 i와 k 사이의 거리와 동일하게 지나가는 부메랑의 수를 구하는 문제이다.
- points 내 i번째 존재하는 점인 point[i]는 [xi, yi]로 표현한다.
- 문제 풀이에 필요한 변수를 정의한다.
- number는 각 점을 지나는 부메랑의 개수를 세기 위한 변수로, 0으로 초기화한다.
- map은 동일한 거리의 점의 수를 저장할 변수로, HashMap으로 초기화한다.
- 0부터 point의 길이 전까지 i를 증가시키며 아래의 반복을 수행한다.
- 0부터 point의 길이 전까지 j를 증가시키며 아래의 반복을 다시 수행한다.
- i와 j가 동일한 경우, 다음 반복을 계속 수행한다.
- distance에 4번에서 정의한 calculateDistance(int[] pointA, int[] pointB) 메서드를 수행하여 a와 b 사이의 거리를 넣어준다.
- map에서 distance가 같은 점이 존재하는지 여부를 확인하여 point에 넣고, 없으면 0을 넣어준다.
- point가 1개 이상인 경우, 부메랑은 곡선으로 순하여 다시 돌아오므로, 돌아오는 쪽에서 던져서 던지는 쪽에서 받는 경우를 포함하여 number에 point의 2배를 넣어준다.
- map에 dsitance에 해당하는 값에 $point + 1$로 넣어준다.
- map을 초기화 시켜주고 반복을 계속 수행한다.
- 0부터 point의 길이 전까지 j를 증가시키며 아래의 반복을 다시 수행한다.
- 두 점 사이의 거리를 계산하기 위한 calculateDistance(int[] pointA, int[] pointB) 메서드를 정의한다.
- pointA와 pointB 사이의 x축 거리를 변수 x에 넣고, y에 축 거리를 변수 y에 넣어준다.
- 거리를 구하기 위한 기본 공식에서 제곱근을 수행하기 전인 x의 제곱과 y의 제곱의 합을 반환한다.
- $x = y$이면 $x^2 = y^2$이고, $\sqrt{x} = \sqrt{y}$가 성립하므로 제곱근을 수행하지 않은 값이 동일하지 않은 경우, 거리 또한 동일하지 않는다.
- 반복이 완료되면 부메랑의 수인 number를 주어진 문제의 결과로 반환한다.
소스
Sample Code는 여기에서 확인 가능합니다.
댓글남기기