백준 1358번 문제 바로가기

최근 한달간 알고리즘 문제풀이가 뜸했는데, 다시 마음을 다잡고 차근차근 풀어보려 한다.

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;
}