느낀점 및 설명 ¶
- 속도를 향상 시키는 방법은 스스로 생각해 볼것!^^
소스 ¶
~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)); } } } }