최근 한달간 알고리즘 문제풀이가 뜸했는데, 다시 마음을 다잡고 차근차근 풀어보려 한다.
1358번은 비교적 간단한 기하학 문제였는데, y축이나 x축 둘 중 하나를 기준잡고 부등식을 풀어서 판별하는 방식이 가장 효과적이다. 이 문제의 경우 y축
을 기준으로 잡는 편이 수학적으로 간결하고 조건 분기가 간단해져 코드가 짧아지는데, 나의 경우 그냥 x축
을 기준으로 풀어내긴 했다.
원의 방정식
을 활용해서 x에 따른 y의 범위를 부등식으로 풀어내는 것이 핵심! 사실 식만 세우면 따로 더 고민할 필요가 없는 쉬운 문제였다.
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
int W, H, X, Y, P, cnt=0, x, y;
cin >> W >> H >> X >> Y >> P;
for (int i=0; i<P; i++){
cin >> x >> y;
if (x<X){
if (y >= Y+H/2-sqrt(pow((H/2),2)-pow((x-X),2)) and y <= Y+H/2+sqrt(pow((H/2),2)-pow((x-X),2))){
cnt++;
}
} else if (x>X+W){
if (y >= Y+H/2-sqrt(pow((H/2),2)-pow((x-X-W),2)) and y <= Y+H/2+sqrt(pow((H/2),2)-pow((x-X-W),2))){
cnt++;
}
} else{
if (Y<=y and y<=Y+H){
cnt++;
}
}
}
cout << cnt;
return 0;
}