Problem Solving/백준

[백준-20206] 푸앙이가 길을 건너간 이유

문제

흑석동은 최근 뉴타운 공사로 인하여 지나가면 안되는 위험 지역이 존재한다. 이 지역은 X축, Y축과 평행한 직사각형 형태로 이루어져 있다.

중앙대의 마스코트인 푸앙이는 직선 상의 경로를 따라서 흑석동을 통과하고 있다. 이 때 흑석동의 망령 호민이는 푸앙이가 위험지역에 지나갈 것 같다는 생각이 들었다. 따라서 푸앙이가 위험 지역을 지나가는지 여부를 알아내어서 푸앙이가 해당 지역을 지나가지 못하도록 조치를 취할 예정이다.

호민이를 위해 푸앙이가 위험 지역을 지나는 지 알려주는 프로그램을 작성해보자.

입력

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

둘째 줄에는 정수 X1, X2, Y1, Y2 (-100,000 ≤ X1 < X2 ≤ 100,000, -100,000 ≤ Y1 < Y2 ≤ 100,000) 이 주어진다. 직사각형의 테두리들은 x = X1, x = X2, y = Y1, y = Y2 에 해당하는 직선에 포함된다.

출력

첫째 줄에 푸앙이가 위험지역을 통과하면 “Poor”를, 통과하지 않으면 “Lucky”을 출력하라. 위험 지역의 모서리만 통과하거나, 테두리 위로만 지나가는 경우는 위험지역을 통과하지 않는 것으로 간주한다.

예제 입력 1 

3 4 5

-1 0 -1 0

예제 출력 1 

Poor

예제 1에 주어진 수들을 그래프로 그리면 다음과 같다.

예제 입력 2 

1 1 -2

-1 1 -1 1

예제 출력 2 

Lucky

예제 2에 주어진 수들을 그래프로 그리면 다음과 같다.

모서리를 통과하지만 위험지역을 통과하지 않는 것으로 간주하므로 Lucky를 출력한다.

 


<Code>

//20206] 푸앙이가 길을 건너간 이유
#include <iostream>
#include <algorithm> 
#include <vector>
using namespace std;

int main(){
  //freopen("input.txt", "rt", stdin);
  int a, b, c, ch1=0, ch2=0;
  double x1, x2, y1, y2;
  double sx1, sx2, sy1, sy2;
  scanf("%d %d %d", &a, &b, &c);
  scanf("%lf %lf %lf %lf", &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});

  for(int i=0; i<4; i++){
    if(v[i].first*a + v[i].second*b >= -c) ch1++;
    if(v[i].first*a + v[i].second*b <= -c) ch2++;
  }
  
  if(ch1==4 || ch2==4) printf("Lucky");
  else printf("Poor");
  return 0;
}

<Comment>

일단 굉장히 오랜만에 마주친 일차방정식 'ax+by+c=0'이라는 문구(?)식(?)..
기울기, x절편, y절편 생각나는걸 끄적여보는데 꽤 오랬동안 고민함.
뭔가 -(c/a)랑 -(c/b) 썼어->그래서 뭐???->사고정지 ㅋㅋㅋ머리가 왜이렇게 안돌아갔나몰라
처음 생각했던건 기울기에 따라 if로 경우의 수를 다 따져야 하나? 부호는 어떻게 되지? 온갖 생각 다들었음.
  • 점과 직선의 위치관계를 이용하는 것인데,
  • ax+by+c=0의 직선과 점 (p,q)가 있을 때, ap+bq>c인지, ap+bq<c인지가 직선의 위와 아래 구분.
  • 따라서 직사각형을 이루는 네 점이 모두 한쪽에 몰려있으면 직선이 직사각형을 지나지 않음.

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

 

'Problem Solving > 백준' 카테고리의 다른 글

[백준-3214] 피자  (0) 2021.09.16
[백준-4779] 칸토어 집합  (0) 2021.09.16
[백준-22973] 점프 숨바꼭질  (0) 2021.09.08
[백준-11582] 치킨 TOP N  (0) 2021.09.04
[백준-1789] 수들의 합  (0) 2021.09.04