순간을 성실히, 화려함보단 꾸준함을

[ boj : 2121 ] 넷이 놀기 본문

알고리즘,SQL/백준,BOJ

[ boj : 2121 ] 넷이 놀기

폭발토끼 2021. 3. 18. 22:32

www.acmicpc.net/problem/2121

 

2121번: 넷이 놀기

첫 줄에 점들의 개수 N(5<=N<=500,000)이 주어진다. 둘째 줄에 만들고 싶은 직사각형의 가로 길이 A와 세로 길이 B가 주어진다. 다음 N줄에 걸쳐서 점들의 좌표가 정수로 주어진다. 이 값의 범위는 -1,00

www.acmicpc.net

문제 : 좌표들이 주어지고 (가로,세로) 에 맞는 직사각형을 그릴수 있는 개수를 구하시오

 

해설 : 처음에는 전 되게 복잡하게 생각했습니다.

주어지는 좌표들을 정렬한다음에 각 좌표들에 대해서 x축을 기준으로 lower_bound 와 upper_bound를 구해준다음 이 범위 내에서 y에 해당하는 값이 존재한다면 카운트해주는 방법,,,으로 풀려했는데

전혀 이렇게 복잡하게 풀 필요도 없는 문제였더라구요.

 

그냥 주어진 좌표들을 전부 set에다가 박아줍니다. 그리고 (a+x,b) (a,b+y) (a+x,b+y) 이 세점이 set에 존재한다면 직사각형을 만들 수 있다는 뜻이니 카운트 해주면 됩니다.

 

#include<bits/stdc++.h>

using namespace std;

set<pair<int, int>> s;

int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);

	int n;
	int x, y;
	vector<pair<int, int>> v;
	cin >> n >> x >> y;
	v.resize(n);
	for (int i = 0; i < n; i++) {
		cin >> v[i].first >> v[i].second;
		s.insert({ v[i].first,v[i].second });
	}
	int a, b;
	int ans = 0;
	for (int i = 0; i < n; i++) {
		a = v[i].first;
		b = v[i].second;

		if (s.find({ a + x,b }) == s.end())continue;
		if (s.find({ a,b + y }) == s.end())continue;
		if (s.find({ a + x,b + y }) == s.end())continue;
		ans++;
	}
	cout << ans;
	return 0;
}

'알고리즘,SQL > 백준,BOJ' 카테고리의 다른 글

[ boj : 1090 ] 체커  (0) 2021.03.25
[ boj : 2357 ] 농구 골대 세우기  (1) 2021.03.23
[ boj : 14919 ] 분포표 만들기  (0) 2021.03.17
[ boj : 11663 ] 선분 위의 점  (0) 2021.03.14
[ boj : 11561 ] 징검다리  (0) 2021.03.13