- 문제 링크 : boj.kr/2187
- 난이도 : G5
- 태그 : 브루트포스
2187번: 점 고르기
평면에 N(1 ≤ N ≤ 1,000)개의 점들이 있다. 각각의 점들은 정수 값으로 어떤 가중치 S(1 ≤ S ≤ 2,000,000)를 가지고 있다. 또 각각의 점들은 (r, c)의 좌표를 갖는데 이는 (행, 열) 순이다. 또한 1 ≤ r ≤
www.acmicpc.net
코드
#include <bits/stdc++.h>
#define all(x) (x).begin(), (x).end()
#define INF 0x7FFFFFFF
using namespace std;
using ll = long long;
using ld = long double;
using pii = pair<int,int>;
using pll = pair<ll, ll>;
int main()
{
ios::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
int n, a, b;
cin >> n >> a >> b;
vector<pair<int, pii>> arr(n);
for(int i = 0; i < n; i++) {
cin >> arr[i].second.first >> arr[i].second.second >> arr[i].first;
}
int ans = 0;
for(int i = 0; i < n; i++) {
for(int j = 0; j < n; j++) {
auto p = arr[i];
auto q = arr[j];
int da = abs(p.second.first - q.second.first);
int db = abs(p.second.second - q.second.second);
if(da < a && db < b) {
ans = max(ans, abs(p.first - q.first));
}
}
}
cout << ans;
return 0;
}
풀이
처음 문제에 접근할 때 가능한 위치에 직사각형을 치고, 그 안에 어떤 점이 들어가는지 파악하려고 하기 쉽다.
하지만 이 경우 시간초과를 피할 수 없다.
직사각형 안에 들어간 점으로 파악하지 말고, 어떤 점의 쌍들이 직사각형 안에 들어갈 수 있는지를 확인해보자.
그러면 O(N^2)의 시간복잡도로 해결할 수 있다.
728x90
'PS' 카테고리의 다른 글
BOJ 2175 : 땅 자르기 (0) | 2024.03.12 |
---|---|
BOJ 12438 : 새로운 달력 (Large) (0) | 2024.03.11 |
BOJ 1885 : 비부분수열 (0) | 2024.03.09 |
BOJ 1846 : 장기 (0) | 2024.03.08 |
BOJ 1540 : 정사각형의 개수 (0) | 2024.03.07 |