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);