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