# 문제
임씨의 이름이 새겨진 옥구슬의 위치 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;
}
728x90
'백준 > C++' 카테고리의 다른 글
[백준] 14215번: 세 막대 | C++ 풀이 (0) | 2023.06.15 |
---|---|
[백준] 10101번: 삼각형 외우기 | C++ 풀이 (0) | 2023.06.14 |
[백준] 1085번: 직사각형에서 탈출 | C++ 풀이 (0) | 2023.06.12 |
[백준] 11653번: 소인수분해 | C++ 풀이 (0) | 2023.06.11 |
[백준] 2581번: 소수 | C++ 풀이 (0) | 2023.06.10 |