PS

BOJ 2187 : 점 고르기

lickelon 2024. 3. 10. 22:53
  • 문제 링크 : 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)의 시간복잡도로 해결할 수 있다.

'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