문제풀이/백준oj

[백준OJ] 8983번 사냥꾼

Hyeon-Uk 2021. 3. 27. 21:30
반응형

www.acmicpc.net/problem/8983

 

8983번: 사냥꾼

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

www.acmicpc.net


 

-풀이-

1. 사대들을 입력받고 정렬을 해준다.

2. 입력받는 동물의 x,y좌표를 입력받은 뒤, 이 동물의 x좌표와 같거나, 같지않다면 x보다 큰 값중 가장 작은 값의 인덱스를 구해준다.(lower_bound) 

3. 해당 사대와의 거리를 구해주어 l보다 작다면 cnt를 1 더해준다.

4. 3번이 안되는 경우중, 3번의 인덱스보다 1작은 위치에 있는 사대와도 비교를 해준다.

 

4번이 왜 그러냐면, lower_bound를 통해 얻은 사대를 b사대라고 하면, (b-1).x<= x <= (b.x) 가 되기때문에, 양 사이드를 모두 비교해 주는 것이다.

 

-시간 복잡도- 

처음 사대를 입력받고, 정렬하는데 O(MlogM)의 시간이 걸린다.

아래 로직을 구하는것은 M에대한 lower_bound를 N번 수행하므로 O(NlogM)이 된다.

M과 N의 최댓값이 똑같으므로 수행시간은 O(NlogN)이 된다.

 

-코드-

 

#include<iostream>
#include<algorithm>
#include<vector>
#include<cmath>
using namespace std;

vector<long long> M;

int main() {
	ios_base::sync_with_stdio(0);
	cin.tie(0);
	long long n, m, l, cnt = 0;
	cin >> m >> n >> l;
	for (long long i = 0; i < m; i++) {
		long long data;
		cin >> data;
		M.push_back(data);
	}
	sort(M.begin(), M.end());
	for (long long i = 0; i < n; i++) {
		long long x, y;
		cin >> x >> y;

		long long ind = lower_bound(M.begin(), M.end(), x) - M.begin();
		if (abs(M[ind] - x) + y <= l) cnt++;
		else if (ind - 1 >= 0 && abs(M[ind - 1] - x) + y <= l) cnt++;
	}
	cout << cnt;
}

 

반응형