작성일 :

문제 링크

22341번 - 사각형 면적

설명

점이 종이 안에 있을 때 가로/세로로 자른 뒤 남는 면적이 큰 쪽을 선택하며 종이를 갱신하는 문제입니다.


접근법

현재 종이 크기를 A(세로), B(가로)로 유지합니다.

점 (X, Y)가 범위 밖이면 무시합니다. 안쪽이면 가로로 자른 경우 면적은 X * B, 세로로 자른 경우는 A * Y입니다.

면적이 같으면 가로로 자르므로 A = X, 그렇지 않으면 더 큰 면적 쪽으로 A 또는 B를 갱신합니다.

모든 점을 처리한 뒤 A * B를 출력합니다.


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
using System;

class Program {
  static void Main() {
    var first = Console.ReadLine()!.Split();
    var n = int.Parse(first[0]);
    var c = int.Parse(first[1]);

    var a = n;
    var b = n;
    for (var i = 0; i < c; i++) {
      var parts = Console.ReadLine()!.Split();
      var x = int.Parse(parts[0]);
      var y = int.Parse(parts[1]);

      if (x >= a || y >= b) continue;

      var areaH = x * b;
      var areaV = a * y;
      if (areaH >= areaV) a = x;
      else b = y;
    }

    Console.WriteLine(a * b);
  }
}

C++

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

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

  int n, c; cin >> n >> c;
  int a = n, b = n;
  for (int i = 0; i < c; i++) {
    int x, y; cin >> x >> y;
    if (x >= a || y >= b) continue;

    int areaH = x * b;
    int areaV = a * y;
    if (areaH >= areaV) a = x;
    else b = y;
  }

  cout << a * b << "\n";

  return 0;
}