문제 링크: https://leetcode.com/problems/k-closest-points-to-origin/
문제는 다음과 같습니다.
원점에서 주어진 점들 중 가장 거리가 가까운 순서대로 k개만큼 벡터에 담으면 되는 문제입니다.
저는 정렬을 위해 우선순위 큐를 이용하였구요,
직접 정렬 함수를 지정해주었습니다.
제 코드는 다음과 같습니다.
class Solution {
public:
struct cmp{
bool operator()(vector<int>&a, vector<int>&b){
double res1 = hypot(a[0], a[1]);
double res2 = hypot(b[0], b[1]);
return res1 > res2;
}
};
vector<vector<int>> kClosest(vector<vector<int>>& points, int k) {
priority_queue<vector<int>, vector<vector<int>>, cmp> pq;
for(int i=0; i<points.size(); i++){
pq.push(points[i]);
}
vector<vector<int>> res;
for(int i=0; i<k; i++){
res.push_back(pq.top());
pq.pop();
}
return res;
}
};
원점과의 거리를 구하기 위해 그냥 제곱만을 쓸라고 했었는데,
c++에 직각삼각형의 빗변의 길이를 구하는 내장함수가 있더라구요! 저도 문제풀다가 abs랑 sqrt랑 헷갈려서 찾아보다가 알게 되었습니다 ㅎㅎ
#include <math.h>
double hypot(double side1, double side2);
hypot() 함수는 side1 및 side2의 두 변의 길이를 기반으로 직각삼각형의 빗변의 길이를 계산합니다. hypot() 함수에 대한 호출은 다음과 같습니다.
sqrt(side1 * side1 + side2 * side2);
hypot() 함수는 직각삼각형의 빗변의 길이를 리턴합니다. 결과가 오버플로인 경우, hypot()는 errno을 ERANGE로 설정하고 값 HUGE_VAL을 리턴합니다. 결과가 언더플로인 경우, hypot()는 errno를 ERANGE로 설정하고 0(영)을 리턴합니다. errno의 값은 EDOM으로 설정될 수도 있습니다.
discussion에서 표를 많이 받은 다른 풀이들도 살펴보았는데요,
대부분 우선순위 큐를 많이 이용했더라구요 ㅎㅎ
그래서 이번엔 참고 풀이를 생략하겠습니다😊