1. 문제
문제 설명
2차원 좌표 평면에 변이 축과 평행한 직사각형이 있습니다. 직사각형 네 꼭짓점의 좌표 [[x1, y1], [x2, y2], [x3, y3], [x4, y4]]가 담겨있는 배열 dots가 매개변수로 주어질 때, 직사각형의 넓이를 return 하도록 solution 함수를 완성해보세요.
제한사항
- dots의 길이 = 4
- dots의 원소의 길이 = 2
- -256 < dots[i]의 원소 < 256
- 잘못된 입력은 주어지지 않습니다.
입출력 예
[[1, 1], [2, 1], [2, 2], [1, 2]] | 1 |
[[-1, -1], [1, 1], [1, -1], [-1, 1]] | 4 |
2. 코드
더보기
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
bool cmp(const vector<int>& a, const vector<int>& b)
{
return a < b;
}
int solution(vector<vector<int>> dots) {
int answer = 0;
int row = 0;
int col = 0;
sort(dots.begin(), dots.end(), cmp);
row = abs(dots[1][0] - dots[2][0]);
col = abs(dots[0][1] - dots[1][1]);
return answer = row * col;
}
3. 분석
이 문제는 좌표평면 상 4개의 점을 이중벡터로 제공하여 직사각형의 넓이를 구하도록 하는 문제이다.
직사각형의 각 변이 x축, y축과 평행하기 때문에 직사각형의 윗변과 아랫변에 해당하는 두 점은 같은 y축 상에 있으며
직사각형의 왼쪽변과 오른쪽변에 해당하는 두 점은 같은 x축 상에 있다.
따라서, 이중벡터를 x축 좌표에 따라 정렬한 후 앞의 두 점의 y 좌표 차이가 직사각형의 왼쪽변, 오른쪽변의 길이이고
이중벡터의 원소 중 x좌표가 다른 두 점의 차이가 직사각형의 윗변, 아랫변의 길이가 될 것이다.
(1) 이중벡터의 정렬
sort(dots.begin(), dots.end(), less<int>());
이중벡터를 위처럼 algorithm 헤더의 sort 함수로는 정렬이 안된다.
마지막 조건부인 오름차순 정렬의 int형이기 때문이다.
따라서 마지막 조건부를 vector<int>를 비교하도록 직접 구현하면 가능하다.
bool cmp(const vector<int>& a, const vector<int>& b)
{
return a < b;
}
sort(dots.begin(), dots.end(), cmp);
'코딩 테스트 연습' 카테고리의 다른 글
0-8. 안전지대 ( 지뢰 찾기 ) (0) | 2023.08.30 |
---|---|
0-7. 평행 ( 두 직선의 평행 ) (0) | 2023.08.30 |
0-5. 소인수 분해 (set 컨테이너) (1) | 2023.08.30 |
0-4. 무작위로 K개의 수 뽑기 ( 배열의 중복된 수 제거하기 ) (0) | 2023.08.24 |
0-3. Stringstream (0) | 2023.08.21 |