BOJ

백준 1358번 하키 [C언어]

Sloth Coder 2022. 8. 30. 15:38

문제 출처: https://www.acmicpc.net/problem/1358

 

1358번: 하키

첫째 줄에 수 W H X Y P가 주어진다. P는 선수의 수이다. W와 H는 100보다 작거나 같은 자연수이고, H는 짝수이다. X와 Y는 절댓값이 100보다 작거나 같은 정수이다. P는 최대 50인 자연수이다. 둘째 줄부

www.acmicpc.net

 

 

Sol)

#include <stdio.h>
#include <math.h>

int main(){
    int width, height, x, y, player_num;
    int radius, player_x, player_y, cnt = 0;

    scanf("%d %d %d %d %d", &width, &height, &x, &y, &player_num);

    radius = height / 2;

    while(player_num--){
        scanf("%d %d", &player_x, &player_y);

        if(player_y >= y && player_y <= y + height){ //y범위를 넘어가면 어떤 경우에도 링크 안에 들어올 수 없다.
            if(player_x >= x && player_x <= x + width) //직사각형 안에 있으면
                cnt++;
            else if(player_x >= x - radius && player_x <= x){
                if(pow(player_x - x, 2) + pow(player_y - (y + radius), 2) <= pow(radius, 2)) //왼쪽 반원 안에 있으면
                    cnt++;
            }
            else if(player_x >= x + width && player_x <= x + width + radius){
                if(pow(player_x - (x + width), 2) + pow(player_y - (y + radius), 2) <= pow(radius, 2)) //오른쪽 반원 안에 있으면
                    cnt++;
            }
        }
    }

    printf("%d\n", cnt);

    return 0;
}

 

  • 풀이 방향

하키 링크장 안에 있는 선수들의 수를 주어진 좌표를 이용해 세는 문제이다. 직사각형 안에 있는 선수들 + 양쪽 반 원 안에 있는 선수들을 세면 되므로 주어진 좌표에 맞게 원의 방정식만 만들면 풀 수 있을 것이다.

 

  • 풀이

먼저, 주어진 y좌표의 범위를 넘어가는 위치에 있는 선수들은 x좌표에 상관없이 링크장 안에 들어올 수 없으므로 y좌표 범위를 충족시키는지 여부를 가장 먼저 체크한다. 그 후, x좌표와 직사각형의 가로길이를 이용해 직사각형 안에 있는지 체크, 원의 방정식을 세워 선수의 좌표가 해당 원의 방정식을 만족시키는지 각각 체크해 준다.

 

  • 문제에 대한 사견

시간에 대한 압박도 없었고, 결국 식만 잘 세우면 되는 문제였다.