### 느낀점 및 설명 ¶

- 속도를 향상 시키는 방법은 스스로 생각해 볼것!^^

### 소스 ¶

```~cpp
#include <iostream>
#include <string>
#include <vector>
#include <cmath>
#include <Windows.h>

using namespace std;

struct SMyPoint{
double x;
double y;
SMyPoint(double inputX, double inputY)
{
x = inputX;
y = inputY;
}
bool operator == (const SMyPoint& target)
{
return x == target.x && y == target.y;
}
};

const double MAX_LEGTH = 5.0;
vector<SMyPoint> g_points;
vector< vector<SMyPoint> > g_hitPoints;

double GetLength(SMyPoint& one, SMyPoint another)
{
return sqrt((one.x - another.x) * (one.x - another.x) + (one.y - another.y) * (one.y - another.y));
}

void initHitPoints()
{
g_hitPoints.clear();
for (register int i = 0; i < (int)g_points.size(); ++i)
{
vector<SMyPoint> temp;
temp.push_back(g_points[i]);
g_hitPoints.push_back(temp);
}
}

int GetMaxChipNumber()
{
initHitPoints();
for (register int i = 0; i < (int)g_points.size(); ++i)
{
int nowSuchLength = (int)g_hitPoints.size();
for (register int j = 0; j < nowSuchLength; ++j)
{
bool isAllHit = TRUE;
for (register int k = 0; k < (int)g_hitPoints[j].size(); ++k)
{
if (MAX_LEGTH < GetLength(g_points[i], g_hitPoints[j][k]) || g_points[i] == g_hitPoints[j][k])
{
isAllHit = FALSE;
break;
}
}
if (isAllHit)
{
g_hitPoints.push_back(g_hitPoints[j]);
g_hitPoints[(int)g_hitPoints.size() - 1].push_back(g_points[i]);
}
}
}
int maxPoint = 0;
for (register int i = 0; i < (int)g_hitPoints.size(); ++i)
{
if (maxPoint < (int)g_hitPoints[i].size())
maxPoint = (int)g_hitPoints[i].size();
}
return maxPoint;
}

void main()
{
int testCaseNumber = 0;
string oneLine;
float pointX, pointY;
cin >> testCaseNumber;
getline(cin, oneLine);
getline(cin, oneLine);
for (register int i = 0; i < testCaseNumber; ++i)
{
while(1)
{
getline(cin, oneLine);
if (0 == strlen(oneLine.c_str()))
{
cout << GetMaxChipNumber() << endl;
break;
}
else
{
sscanf(oneLine.c_str(), "%f %f", &pointX, &pointY);
g_points.push_back(SMyPoint(pointX, pointY));
}
}
}
}
```