Problem Solving/BOJ

[백준 / BOJ] C++ 20206 푸앙이가 길을 건너간 이유

nageune 2023. 9. 30. 10:28
728x90
반응형

20206번: 푸앙이가 길을 건너간 이유

 

문제

https://www.acmicpc.net/problem/20206

 

20206번: 푸앙이가 길을 건너간 이유

첫째 줄에는 정수 A, B, C (-10,000 ≤ A, B ≤ 10,000, -100,000 ≤ C ≤ 100,000)가 주어진다. 해당 숫자들은 좌표 평면 상에서 Ax+By+C=0 형태로 표현되는 푸앙이가 지나가는 직선 상의 경로을 나타낸다. (단

www.acmicpc.net


풀이

Ax+By+C=0 형태의 표현되는 직선 상의 경로가 직사각형을 통과하는지 여부를 묻는 문제입니다.

Ax+By≤-C 또는 Ax+By≥-C로 식을 바꾸어 생각해야합니다. 문제에서 테두리 위로만 지나가는 경우는 위험지역을 통과하지 않는 것으로 간주한다고 했으므로 등호를 포함해야합니다. 어느 한 점의 좌표 (x, y)에 대해 위 식을 만족하면 각각 직선보다 아래에 있음을, 위에 있음을 나타냅니다.(만날 수도 있습니다.)

만약 직사각형의 네 점이 모두 직선의 아래에 있거나 위에 있으면 직선은 직사각형을 통과하지 않습니다. 따라서 Lucky를 출력합니다. 그렇지 않은 경우 Poor를 출력합니다.


코드

#include <bits/stdc++.h>
using namespace std;

int main() {
  cin.tie(0)->sync_with_stdio(0);
  int a, b, c;
  cin >> a >> b >> c;
  int x1, x2, y1, y2;
  cin >> x1 >> x2 >> y1 >> y2;
  vector<pair<int, int>> v;
  v.push_back({x1, y1});
  v.push_back({x1, y2});
  v.push_back({x2, y1});
  v.push_back({x2, y2});
  int u = 0, d = 0;
  for (auto i : v) {
    if (a * i.first + b * i.second <= -c)
      d++;
    if (a * i.first + b * i.second >= -c)
      u++;
  }
  if (u == 4 || d == 4)
    cout << "Lucky";
  else
    cout << "Poor";
  return 0;
}

 

728x90
반응형