티스토리 뷰
15973번: 두 박스
표준 입력으로 두 박스의 정보가 한 줄에 하나씩 주어진다. 각 박스의 정보는 왼쪽 아래 꼭짓점 좌표 (x1, y1)과 오른쪽 위 꼭짓점 좌표 (x2, y2)로 구성되는데 이들 좌푯값 x1, y1, x2, y2 (x1 < x2, y1 < y2)
www.acmicpc.net
오랜만에 수학 문제를 풀고 싶어서 도전했지만 수학이라기보단 노가다 문제였습니다.
문제는 어렵지 않다. 두 박스가 한 점에서 만나는지 선으로 만나는지 교차하는지 (내부에 포함되는 것 포함)
만나지 않는지를 나누어 계산하면 됩니다.
상대적으로 정답률이 낮은 이유는 아마 여러 경우 중 놓친 것이 있거나 했기 때문일 것입니다.
(나도 몇 번 틀렸다.)
구조체를 이용하여 구현하면 좀 더 깔끔할 것이고, 좌표를 큰 값에서 작은 값으로 항상 빼도록 하면 더 깔끔하겠지만
힘이 빠져 그러지 못했습니다. ㅎㅎ
#include<iostream>
#include<vector>
#include<algorithm>
#include<string>
using namespace std;
vector<pair<long long, long long>>box1, box2;
vector<string>result;
string res;
void make_box()
{
long long x1, y1;
long long x2, y2;
cin >> x1 >> y1 >> x2 >> y2;
box1.push_back({ x1,y1 });
box1.push_back({ x2,y2 });
cin >> x1 >> y1 >> x2 >> y2;
box2.push_back({ x1,y1 });
box2.push_back({ x2,y2 });
result.push_back("POINT");
result.push_back("LINE");
result.push_back("FACE");
result.push_back("NULL");
}
string solve(vector<pair<long long,long long>>v1,vector<pair<long long,long long>>v2)
{
if (v1[0].first == v2[1].first || v1[1].first == v2[0].first)
{
if (v1[0].second == v2[1].second || v1[1].second == v2[0].second)
return result[0];
else if ((abs(v1[1].second - v1[0].second) + abs(v2[1].second - v2[0].second)) > max(abs(v1[1].second - v2[0].second), abs(v1[0].second - v2[1].second)))
{
return result[1];
}
else
return result[3];
}
else if ((abs(v1[0].first - v1[1].first) + abs(v2[0].first - v2[1].first)) > max(abs(v1[0].first - v2[1].first), abs(v1[1].first - v2[0].first)))
{
if (v1[0].second == v2[1].second || v1[1].second == v2[0].second)
return result[1];
else if ((abs(v1[1].second - v1[0].second) + abs(v2[1].second - v2[0].second)) > max(abs(v1[0].second - v2[1].second), abs(v1[1].second - v2[0].second)))
return result[2];
else
return result[3];
}
else
return result[3];
}
int main()
{
make_box();
res = solve(box1, box2);
cout << res;
}
'알고리즘 > 백준' 카테고리의 다른 글
백준 / BOJ / 1764 듣보잡 C++ (0) | 2020.11.19 |
---|---|
백준 / BOJ / 5557 1학년 C++ (0) | 2020.11.16 |
백준 / BOJ / 16236 아기상어 C++ (0) | 2020.11.15 |
백준 / BOJ / 2636 치즈 C++ (0) | 2020.11.10 |
백준 / BOJ / 1946 신입 사원 C++ (0) | 2020.11.10 |
댓글