[백준 22341] 사각형 면적 (C#, C++) - soo:bak
작성일 :
문제 링크
설명
점이 종이 안에 있을 때 가로/세로로 자른 뒤 남는 면적이 큰 쪽을 선택하며 종이를 갱신하는 문제입니다.
접근법
현재 종이 크기를 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;
}