https://www.acmicpc.net/problem/2246
문제
> 콘도를 선정할 때 가급적 싸고 바닷가에 가까운 곳으로 하려고한다.
> 두 조건을 만족하는 콘도 x가 후보가 된다.
1. X보다 바닷가에 더 가까운 콘도들은 모두 X보다 숙박비가 더 비싸다.
2. X보다 숙박비가 더 싼 콘도들은 모두 X보다 바닷가에서 더 멀다.
> 각 콘도의 바닷가에서의 거리, 숙박비 정보가 주어졌을 때, 후보 콘도의 개수를 구해라.
접근
거리와 가격을 쌍으로 입력받아 저장한 후 반복문을 돌려 조건을 검증하는데 조건에 맞지않는다면 다음 반복으로 넘어간다. 조건에 부합하면 cnt값은 누적하고 출력한다.
문제해결
> 거리와 숙박비를 pair로 벡터에 넣는다.
> 이중for문으로 각각의 후보들을 조건에 맞게 비교한다.
> 두 가지 조건을 종합하면 x가 후보가 되려면 다른 y들보다 가격이나 거리가 작거나 같아야 우선 좋은 선택지 후보가 되고 거기서 추가로 더 싸거나, 더 가까워야 최종 후보가 된다. 따라서 이를 수식화하여 조건으로 넣는다.
> 조건에 맞지 않으면 반복문을 깨 다음 후보들과 비교하고 맞으면 cnt값을 누적하고 출력한다.
코드
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
int N, D, C;
cin >> N;
vector<pair<int, int>> condo(N);
for (int i = 0; i < N; i++) cin >> condo[i].first >> condo[i].second;
int cnt = 0;
for (auto& x : condo)
{
bool valid = true;
for (auto& y : condo)
{
if (y.first <= x.first && y.second <= x.second)
{
if (y.first < x.first || y.second < x.second)
{
valid = false;
break;
}
}
}
if (valid) cnt++;
}
cout << cnt << '\n';
}

후기
단순히 주어진 조건을 수식으로 표현하려고 이것 저것 복잡하게 썼지만 실패했고, 이를 계속 보고 결국 최종적으로 원하는 조건이 무엇인지 이해한 후 조건을 정리해 썼다.
최근 조건관련 문제를 많이 봤는데 글자 그래도의 조건에 얽메이지 말고 조건이 결국 하는말, 원하는 말이 뭔지를 파악하고 짜야곘다.