BOJ

8983. 사냥꾼

hyunnwoo 2023. 6. 28. 21:29

https://www.acmicpc.net/problem/8983

 

8983번: 사냥꾼

KOI 사냥터에는 N 마리의 동물들이 각각 특정한 위치에 살고 있다. 사냥터에 온 사냥꾼은 일직선 상에 위치한 M 개의 사대(총을 쏘는 장소)에서만 사격이 가능하다. 편의상, 일직선을 x-축이라 가

www.acmicpc.net

 

티어는 골드4, 완성하는데 15~20분 정도 걸렸다.

이진탐색(Binary Search)를 활용하여 해결하였다.

 

코드의 가독성을 높이기 위해서 main 함수의 코드를 줄이고, 함수를 활용하여 코드를 나누어보았다.

앞으로도 이렇게 코딩하는 습관을 가지도록 해야겠다.

 

#include<stdio.h>
#include<algorithm>

using namespace std;

int n, m, l, ans;
int shot[100005];

struct xy{
    int x;
    int y;
} animals[100005];

void input(){
    scanf("%d %d %d", &m, &n, &l);
    for(int i=0 ; i<m ; i++) scanf("%d", &shot[i]);
    for(int i=0 ; i<n ; i++) scanf("%d %d", &animals[i].x, &animals[i].y);
}

int minDistance(int i, int left, int right){
    if(abs(left-right) <= 1){
        int leftDistance = abs(shot[left]-animals[i].x);
        int rightDistance = abs(shot[right]-animals[i].x);
        if(leftDistance < rightDistance) return leftDistance;
        else return rightDistance;
    }

    int mid = (left + right)/2;
    if(shot[mid] > animals[i].x) return minDistance(i, left, mid);
    else return minDistance(i, mid, right);
}

int main()
{
    input();

    sort(shot, shot+m);

    for(int i=0 ; i<n ; i++){
        if(minDistance(i, 0, m-1) + animals[i].y <= l) ans++;
    }

    printf("%d", ans);
}