※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※
이번에 볼 문제는 백준 2187번 문제인 점 고르기이다.
문제는 아래 링크를 확인하자.
https://www.acmicpc.net/problem/2187
어떤 두 점의 두 가중치가 직사각형에 포함된 점들의 가중치 중 가장 큰 수와 작은 수가 되기 위해서는 이 두 점이 같은 직사각형 안에 있을 수 있어야 함을 관찰하자. 두 점이 같은 직사각형에 포함되어 있을 수 있는지의 여부는 두 점의 좌표의 차를 이용해 간단하게 판별할 수 있다.
한편, 여기서 더 나아가 같은 직사각형에 포함되어 있을 수 있는 두 점의 쌍들을 전부 살펴 그 가중치 차의 최댓값을 찾는 것으로 문제를 해결할 수 있음을 보일 수 있다. 모든 두 점의 쌍을 확인하므로 정답이 되는 경우의 두 점의 쌍을 무조건 확인하며, 답을 구성하는 경우가 아닌 모든 경우는 (1) 두 점이 직사각형의 가장 크고 작은 두 가중치를 이루지 못하거나 (2) 두 가중치의 차가 답보다 작다는 점을 이용하면 이를 어렵지 않게 보일 수 있다.
아래는 제출한 소스코드이다.
#include <iostream>
using namespace std;
int N, A, B;
int X[1000], Y[1000], C[1000];
int ans;
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cin >> N >> A >> B;
for (int i = 0; i < N; i++) cin >> X[i] >> Y[i] >> C[i];
for (int i = 0; i < N; i++) {
for (int j = i + 1; j < N; j++) {
if (abs(X[i] - X[j]) < A && abs(Y[i] - Y[j]) < B) {
ans = max(ans, abs(C[i] - C[j]));
}
}
}
cout << ans;
}
728x90
'BOJ' 카테고리의 다른 글
[BOJ 27738 // C++] 연산자 파티 (0) | 2024.06.23 |
---|---|
[BOJ 13352 // C++] 석양이 진다... (0) | 2024.06.22 |
[BOJ 3688 // C++] 래프팅 디자인 (0) | 2024.06.20 |
[BOJ 22683 // C++] Square Route (1) | 2024.06.19 |
[BOJ 25140 // C++] KLIZA (0) | 2024.06.18 |