백준/C++

[백준] 9063번: 대지 | C++ 풀이

성실한 당근농부 2023. 6. 13. 17:19

# 문제

임씨의 이름이 새겨진 옥구슬의 위치 N 개가 주어질 때에, 임씨에게 돌아갈 대지의 넓이를 계산하는 프로그램을 작성하시오. 단, 옥구슬의 위치는 2 차원 정수 좌표로 주어지고 옥구슬은 같은 위치에 여러 개가 발견될 수도 있으며, x 축의 양의방향을 동쪽, y 축의 양의방향을 북쪽이라고 가정한다. 

 

 


 

# 풀이

답을 찾는 방법은 간단하다. 대소 비교를 통해 좌표를 찾아주면 되는데 방법은 여러가지다.

우선 정답 소스코드부터 확인해보자.

 

#include <iostream>
#include <algorithm>
using namespace std;

int main(){
    ios_base::sync_with_stdio(false);	// 두 표준 입출력 동기화 해제
    
    int n;
    cin >> n;
    
    // 배열 동적할당
    int* x = new int[n];
    int* y = new int[n];

    for(int i=0; i<n; i++){
        cin >> x[i] >> y[i];
    }
	
    // 오름차순 정렬
    sort(x, x+n);
    sort(y, y+n);

    cout << (x[n-1] - x[0])*(y[n-1] - y[0]);

    // 동적할당 메모리 해제
    delete[] x;
    delete[] y;
    
    return 0;
}

나는 동적배열을 사용해 문제를 풀이했는데 그냥 조건문을 사용해도 된다.

조건문을 사용하는 방법은 각각의 좌표가 -10,000 이상 10,000 이하의 정수라고 했으니 minX, maxX, minY, maxY를 각각 -10,000과 10,000을 넣어 만들고, 새롭게 받는 점의 좌표들과 비교하는 식으로 풀면 될 것 같다. 이렇게 하면 아마 사용하는 메모리 값은 줄어들듯?

 

 

 

int n;
cin >> n;
    
// 배열 동적할당
int* x = new int[n];
int* y = new int[n];

for(int i=0; i<n; i++){
    cin >> x[i] >> y[i];
}

입력되는 점의 개수를 n으로 받고, 점의 개수를 크기로 해 x와 y배열을 동적할당으로 선언해주었다.

그리고 점들을 입력하며 배열에 받아주기.

 

 

 

// 오름차순 정렬
sort(x, x+n);
sort(y, y+n);

cout << (x[n-1] - x[0])*(y[n-1] - y[0]);

x좌표와 y좌표의 최댓값과 최솟값을 찾기 위해 sort를 사용해 오름차순 정렬을 해주었고,

(x좌표의 최댓값 - x좌표의 최솟값) * (y좌표의 최댓값 - y좌표의 최솟값)을 통해 답을 구해주었다.

 

 

 

// 동적할당 메모리 해제
delete[] x;
delete[] y;

동적할당에 사용해준 메모리도 해제하면 끝!

 

 

 

 

 

 

➕ 어라라 조건문으로 돌려봤는데 메모리도 시간도 훨씬 낫길래 코드랑 결과 함께 첨부합니다

 

더보기
#include <iostream>
using namespace std;

int main(){
    ios_base::sync_with_stdio(false);	// 두 표준 입출력 동기화 해제
    
    int minX = 10000, minY = 10000;
    int maxX = -10000, maxY = -10000;
    int a, b, n;
    cin >> n;

    while(n--){
        cin >> a >> b;
		if(a >= maxX) maxX = a;
		if(b >= maxY) maxY = b;
		if(a <= minX) minX = a;
		if(b <= minY) minY = b;
    }
    
    cout << (maxX - minX)*(maxY - minY);
    return 0;
}

 

 


 

 

 

9063번: 대지

첫째 줄에는 점의 개수 N (1 ≤ N ≤ 100,000) 이 주어진다. 이어지는 N 줄에는 각 점의 좌표가 두 개의 정수로 한 줄에 하나씩 주어진다. 각각의 좌표는 -10,000 이상 10,000 이하의 정수이다. 

www.acmicpc.net

 

728x90