x와 y의 좌표가 주어질 때, 선으로 만들 수 있는 최대한의 점 개수를 구하는 문제다. 간단한 수학 문제인 줄 알았지만, 실은 더 복잡했던 문제.
점과 점의 atan2 값을 구해가지고 만일 그 값이 같다면 이는 한 직선에 있다는 의미이므로 해당 값의 점의 수에다가 1을 더한다. 만일 해당 값이 새 값이라면 1을 넣는다.
그리고 최대값을 찾아서 리턴하면 된다.
class Solution {
public int maxPoints(int[][] points) {
int n = points.length;
if(n == 1){
return 1;
}
int max = 2;
for(int i=0; i<n; i++){
Map<Double, Integer> map = new HashMap<>();
for(int j=0; j<n; j++){
if(i != j){
//key, value, remappingFunction
//((v1, v2) -> v2 : v1이 기존이고 v2가 새 값일 때 기존의 값을 사용한다는 것)
map.merge(Math.atan2(points[j][1] - points[i][1],
points[j][0] - points[i][0]), 1, Integer::sum);
}
}
max = Math.max(max, Collections.max(map.values()) + 1);
}
return max;
}
}
https://leetcode.com/problems/max-points-on-a-line/description/