[백준 2527] 직사각형 (C#, C++) - soo:bak
작성일 :
문제 링크
설명
두 직사각형이 주어질 때, 겹치는 부분이 직사각형이면 a, 선분이면 b, 점이면 c, 없으면 d를 출력하는 문제입니다. 4개의 테스트케이스가 주어집니다.
접근법
두 직사각형이 겹치는 부분의 형태는 가로와 세로 방향에서 각각 겹치는 길이로 판단할 수 있습니다.
가로 방향 겹침 길이는 두 직사각형의 오른쪽 끝 중 작은 값에서 왼쪽 끝 중 큰 값을 뺀 것입니다. 세로 방향도 마찬가지로 위쪽 끝 중 작은 값에서 아래쪽 끝 중 큰 값을 뺍니다.
가로와 세로 겹침 길이가 모두 양수이면 직사각형으로 겹칩니다. 둘 중 하나라도 음수이면 겹치지 않습니다. 둘 다 0이면 한 점에서만 만납니다. 하나만 0이면 선분으로 겹칩니다.
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
using System;
class Program {
static void Main() {
for (var t = 0; t < 4; t++) {
var s = Console.ReadLine()!.Split();
var x1 = int.Parse(s[0]);
var y1 = int.Parse(s[1]);
var p1 = int.Parse(s[2]);
var q1 = int.Parse(s[3]);
var x2 = int.Parse(s[4]);
var y2 = int.Parse(s[5]);
var p2 = int.Parse(s[6]);
var q2 = int.Parse(s[7]);
var dx = Math.Min(p1, p2) - Math.Max(x1, x2);
var dy = Math.Min(q1, q2) - Math.Max(y1, y2);
if (dx > 0 && dy > 0) Console.WriteLine("a");
else if (dx < 0 || dy < 0) Console.WriteLine("d");
else if (dx == 0 && dy == 0) Console.WriteLine("c");
else Console.WriteLine("b");
}
}
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <bits/stdc++.h>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
for (int t = 0; t < 4; t++) {
int x1, y1, p1, q1, x2, y2, p2, q2;
cin >> x1 >> y1 >> p1 >> q1 >> x2 >> y2 >> p2 >> q2;
int dx = min(p1, p2) - max(x1, x2);
int dy = min(q1, q2) - max(y1, y2);
if (dx > 0 && dy > 0) cout << "a\n";
else if (dx < 0 || dy < 0) cout << "d\n";
else if (dx == 0 && dy == 0) cout << "c\n";
else cout << "b\n";
}
return 0;
}