작성일 :

문제 링크

32171번 - 직사각형 만들기

설명

여러 개의 직사각형을 모두 포함할 수 있는 가장 작은 직사각형의 둘레를 계산하는 문제입니다.

  • 입력으로 여러 개의 직사각형 좌표가 주어집니다.
  • 각 직사각형은 좌측 하단 꼭짓점과 우측 상단 꼭짓점의 좌표로 표현됩니다.
  • 이 모든 직사각형을 완전히 감싸는 가장 작은 직사각형을 만들고,
  • 그 둘레를 계산하면 됩니다.

접근법

  • 입력으로 들어오는 모든 직사각형을 읽으면서
    • 전체 직사각형을 감싸기 위한 최소 x좌표, 최소 y좌표를 갱신하고
    • 최대 x좌표, 최대 y좌표도 계속 갱신합니다.
  • 모든 입력이 끝난 후, 감싸는 직사각형의 세로 길이는 최댓값 y - 최솟값 y, 가로 길이는 최댓값 x - 최솟값 x가 됩니다.
  • 둘레는 다음 공식으로 계산합니다:
    \(2 \times (가로 + 세로)\)
  • 각 테스트마다 결과를 출력합니다.

Code

[ C# ]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
using System;

class Program {
  static void Main() {
    var minX = 10;
    var minY = 10;
    var maxX = -10;
    var maxY = -10;

    var n = int.Parse(Console.ReadLine());
    while (n-- > 0) {
      var input = Console.ReadLine().Split();
      var x1 = int.Parse(input[0]);
      var y1 = int.Parse(input[1]);
      var x2 = int.Parse(input[2]);
      var y2 = int.Parse(input[3]);

      minX = Math.Min(minX, x1);
      minY = Math.Min(minY, y1);
      maxX = Math.Max(maxX, x2);
      maxY = Math.Max(maxY, y2);

      var perimeter = 2 * ((maxY - minY) + (maxX - minX));
      Console.WriteLine(perimeter);
    }
  }
}



[ C++ ]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <bits/stdc++.h>

using namespace std;

int main() {
  ios::sync_with_stdio(false);
  cin.tie(nullptr);

  int minX = 10, minY = 10, maxX = -10, maxY = -10;

  int n; cin >> n;
  while (n--) {
    int x1, y1, x2, y2; cin >> x1 >> y1 >> x2 >> y2;

    minX = min(x1, minX);
    minY = min(y1, minY);
    maxX = max(x2, maxX);
    maxY = max(y2, maxY);

    cout << 2 * ((maxY - minY) + (maxX - minX)) << "\n";
  }

  return 0;
}