백준/골드
[백준 1438번] 가장 작은 직사각형 (C++)
게임개발기원
2023. 3. 17. 21:30
문제링크 : https://www.acmicpc.net/problem/1438
1438번: 가장 작은 직사각형
예제 1의 경우 (9,4), (9,6), (14,4), (14,6)을 꼭짓점으로 하는 직사각형을 만들면 된다.
www.acmicpc.net
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define MAX 987654321
#define pii pair <int, int>
bool compare(const pii &a, const pii &b)
{
return a.second < b.second;
}
int main(void) {
ios_base::sync_with_stdio(false);
cin.tie(0);
int N, result = MAX;
pii p[100];
cin >> N;
for(int i=0; i<N; i++)
{
cin >> p[i].first >> p[i].second;
}
sort(p, p+N, compare); //y값 기준 정렬
for(int i=0; i<N; i++)
{
for(int j=0; j<N; j++)
{
if(i>j) continue;
int x1 = p[i].first; //fix한 x좌표 2개
int x2 = p[j].first;
if(x1>x2)
{
swap(x1, x2);
}
for(int k=0; k<N; k++)
{
int y1 = p[k].second;
int cnt = 0;
for(int l = k; l<N; l++) //y값 늘려가며 체크
{
int between_x = p[l].first;
int y2 = p[l].second;
if(x1<= between_x && between_x <= x2) //해당 좌표의 x가 fix한 x좌표의 사잇값인지 체크
{
cnt+=1;
}
if (cnt>=N/2)
{
result = min(result, (x2 - x1 + 2) * (y2 - y1 + 2)); //넓이 반환
}
}
}
}
}
cout << result;
return 0;
}
처음으로 푼 골드 2 문제이다.
푸는데 한계를 느껴서 친구의 도움을 받아 풀 수 있었다.
y좌표를 기준으로 정렬을 하고 시작한다
x좌표 2개를 고정시켜놓고 y좌표를 아래로 증가시켜가며 조건에 맞는 좌표를 찾는다.
이런 좌표가 N/2개 이상이라면 결과값에 가장 작은 값을 저장한다.