백준 8983번 python 풀이 - 사냥꾼
문제 링크
해결책
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
import sys
M, N, L = map(int, sys.stdin.readline().rstrip().split())
xList = list(map(int, sys.stdin.readline().rstrip().split()))
animalList = []
ableList = []
xList.sort()
maxA = 0
for i in range(N):
a, b = map(int, sys.stdin.readline().rstrip().split())
# if a > maxA: maxA = a
if b <= L:
animalList.append(list((a, b)))
animalList.sort()
'''
for x in xList:
for j in animalList:
if j not in ableList:
if j[1] - L <= x - j[0] <= L - j[1]:
ableList.append(j)
for i in ableList:
if(i in animalList):
animalList.remove(i)
print(ableList)
'''
ans = 0
for animal in animalList:
left, right = 0, len(xList) - 1
while left <= right:
mid = (left + right)//2
if xList[mid] - animal[0] > L - animal[1]:
right = mid - 1
elif xList[mid] - animal[0] < animal[1] - L:
left = mid + 1
else:
ans += 1
break
print(ans)
주석으로 달 설명
이진탐색 3…! 풀이가 이진탐색인 것만 알면 금방 풀 수 있다. 물론 그걸 눈치채는 것이 어려운 부분이기는 하지만… 조건은 |xi-aj| + bj
, 다시말해 j[1] - L <= x - j[0] <= L - j[1]
일 때 가능하다. 이를 오히려 역으로 뒤집어서, animal의 좌표를 기준으로 x, 즉 포수의 위치를 이진탐색으로 찾아내서, 이가 존재하면 ans+=1, 없으면 break를 하고 다른것을 찾는 방식으로 진행하는 것이다.
This post is licensed under CC BY 4.0 by the author.