[BOJ 17611] 직각다각형

2023. 4. 21. 18:24Baekjoon

728x90

https://www.acmicpc.net/problem/17611

 

17611번: 직각다각형

입력의 첫 줄에는 단순직각다각형의 꼭지점의 개수를 나타내는 정수 n(4 ≤ n ≤ 100,000)이 주어지고, 이어지는 n개 줄 각각에 단순직각다각형 꼭지점의 좌표 (xi, yi)가 차례대로 주어진다. 주어지

www.acmicpc.net

 

- 문제 요약

 

첫 번째 줄에 단순직각다각형의 꼭짓점 개수인 N이 주어진다. ( 4 <= N <= 100,000 )

두 번째 줄부터 N+1번째 줄까지 꼭지점의 좌표 (xi, yi)이 주어진다.

단순직각다각형과 가장 많이 교차하는 수평선 H와 수직선 V의 위치를 찾아 그때의 교차 횟수를 구하고자 한다. 단, 수평선 H는 다각형의 어떤 수평선분과도 겹쳐 놓여서는 안 되고, 유사하게 수직선 V는 다각형의 어떤 수직선분과도 겹쳐 놓여서는 안 된다.

수평선 H의 위치를 잘 정해서 주어진 단순직각다각형의 수직선분과 가장 많이 교차하는 지점을 찾을 때, 그때의 교차 횟수를 h라 하고, 유사하게 수직선 V와 주어진 단순직각다각형의 수평선분과 가장 많이 교차하는 횟수를 v라 할 때, max(h, v)를 출력하는 프로그램을 작성하시오.

 

 

- 알고리즘 정리

 

가로 선분이 H와 몇 번 겹치는지, 세로 선분이 H와 몇 번 겹치는지를 구한 후, 두 값 중 최댓값을 출력해주면 됩니다.

선분이 시작되는 지점에 1을 더해주고 끝나는 지점에 1을 빼주면 위 값들을 구할 수 있습니다.

 

 

- 코드 작성

 

#include<bits/stdc++.h>
using namespace std;

#define MAX 100001
int n,result;
pair<int,int>v[MAX];
vector<pair<int,int> >arr[2];

int main(){
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);
	cin>>n;
	for(int i=0;i<n;i++){
		cin>>v[i].first>>v[i].second;
	}
	for(int i=1;i<=n;i++){
		int l,r,q=i,z=i-1;
		if(q==n){
			q=n-1;
			z=0;
		}
		if(v[q].first==v[z].first){
			l=min(v[q].second,v[z].second);
            r=max(v[q].second,v[z].second);
		}
		else{
			l=min(v[q].first,v[z].first);
            r=max(v[q].first,v[z].first);
		}
		arr[i%2].push_back({l,1});
		arr[i%2].push_back({r,-1});
	}
	for(int i=0;i<2;i++){
		sort(arr[i].begin(),arr[i].end());
		int tmp=0;
		for(auto [t,v]:arr[i]){
			tmp+=v;
			result=max(result,tmp);
		}
	}
	cout<<result;
}

코드 제출 결과

728x90

'Baekjoon' 카테고리의 다른 글

[BOJ 13209] 검역소  (0) 2023.04.22
[BOJ 19590] 비드맨  (0) 2023.04.21
[BOJ 10937] 두부 모판 자르기  (1) 2023.04.20
[BOJ 5550] 헌책방  (0) 2023.04.20
[BOJ 13560] 축구 게임  (0) 2023.04.19