(C++) 백준 2246 - 콘도 선정

코딩너구리·2025년 10월 16일

코딩 문제 풀이

목록 보기
35/266

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';
}

후기

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

0개의 댓글