문제
흑석동은 최근 뉴타운 공사로 인하여 지나가면 안되는 위험 지역이 존재한다. 이 지역은 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 |