나는 이 문제를 2차원 배열을 x좌표에 대해서 오름차순으로 정리했다.
그러면 위와 같은 사각형 꼴로 정렬이 된다. (정확하게는 y축도 정렬을 해주긴 해야한다)
첫번째로 (1, 1)을 선택하고 이후에 있는 (3, 2) 를 선택 후 (2, 2)가 범위 안에 있는지 검사하는 꼴로
문제를 풀면된다.
(1, 1)을 선택하고 이후에 있는 (3, 2) 를 선택
이 부분의 구현은 min max 함수를 사용하고 행과 열이 일치하는 좌표가 있는지 검사하면된다.
for(int i=0; i<n; i++)
{
x=data[i][0];
y=data[i][1];
for(int j=i+1; j<n; j++)
{
tx=data[j][0];
ty=data[j][1];
그 뒤 배열을 탐색하면서, 현재 선택한 좌표와 다음 선택한 좌표를 min, max 함수를 사용해 사각형이 되도록 코드를 짰다.
mx=min(x,tx);
my=min(y,ty);
px=max(x,tx);
py=max(y,ty);
if(mx==px||my==py) continue;
그 뒤 이 사각형 안에 다른 좌표가 있는지 검사했다.
int sw=0;
int jx,jy;
for(int k=i+1; k<j; k++)
{
jx=data[k][0];
jy=data[k][1];
if(jx>mx&&jx<px&&jy>my&&jy<py)
{
sw=1;
break;
}
}
if(sw==0) answer++;
코드를 짜면서,,
if(kx >= mx && kx <= px && ky => my && ky <= py)
{
sw = 1;
break;
}
변에 있는 부분의 좌표도 체크를 했는데,,,지문에서는 변에 있는 좌표는 괜찮다고 나와있다,,,
문제를 꼼곰히 읽자!
#include <vector>
#include <algorithm>
using namespace std;
// 전역 변수를 정의할 경우 함수 내에 초기화 코드를 꼭 작성해주세요.
bool cmp(vector<int> lhs, vector<int> rhs)
{
if(lhs[0] < rhs[0])
return true;
else
return false;
}
int solution(int n, vector<vector<int>> data) {
int answer = 0;
int cx, cy;
int mx, my;
int px, py;
sort(data.begin(), data.end(), cmp);
for(int i = 0; i < n; ++i)
{
cx = data[i][0];
cy = data[i][1];
for(int j = i + 1; j < n; ++j)
{
int jx = data[j][0];
int jy = data[j][1];
mx = min(jx, cx);
my = min(jy, cy);
px = max(jx, cx);
py = max(jy, cy);
if(mx == px || my == py) continue;
int sw = 0;
int kx, ky;
for(int k = i + 1; k < j; ++k)
{
kx = data[k][0];
ky = data[k][1];
if(kx > mx && kx < px && ky > my && ky < py)
{
sw = 1;
break;
}
}
if(sw == 0) ++answer;
}
}
return answer;
}