

국카스텐 - 사냥꾼
들으면서 보시면 집중이 더 잘 될겁니다
식 세우기
예제

(x, y)가 주어질 때, 사이에 위치한 사대가 있는지 확인하면 됩니다.import sys
input = sys.stdin.readline
# 사대의 수, 동물의 수, 사정거리
M, N, L = map(int, input().split())
# 사대의 위치
sadaes = list(map(int, input().split()))
sadaes.sort()
# 이분탐색: 쏠 수 있는 사대가 있나요?
def binary_search(fire_a, fire_b):
l = 0
r = M - 1
while l <= r:
m = (l + r) // 2
if fire_a <= sadaes[m] <= fire_b:
return True
elif sadaes[m] < fire_a:
l = m + 1
else: # fire_b < sadaes[m]
r = m - 1
return False
binary_search 함수는 fire_a <= (사대) <= fire_b 범위에 위치한 사대가 있는지, 이분 탐색을 합니다.sadaes을 정렬해야 합니다.fire_a, fire_b 사이에 있는 경우, 바로 True를 반환합니다.fire_a 이전인 경우, 더 오른쪽을 찾아봐야 하니 l = m + 1로 설정합니다.fire_b 이후인 경우, 더 왼쪽을 찾아봐야 하니 r = m - 1로 설정합니다.False를 반환합니다.
# 동물 수 세기
count = 0
for _ in range(N):
x, y = map(int, input().split())
fire_a = max(sadaes[0], -L + x + y)
fire_b = min(sadaes[-1], L + x - y)
# 해당 동물을 쏠 수 있는 사대가 있는지 확인
if binary_search(fire_a, fire_b):
count += 1
print(count)
(x, y)가 주어지면, 해당 동물을 쏠 수 있는 사대가 fire_a, fire_b범위 내 존재하는지 이분 탐색으로 확인하면 됩니다.fire_a = max(sadaes[0], -L + x + y)), fire_b = min(sadaes[-1], L + x - y)로 설정했습니다.sades[0]는 맨 왼쪽 사대의 위치, sadaes[-1]은 맨 오른쪽 사대의 위치가 됩니다.True를 반환하므로 count가 1 증가합니다. 최종 count가 정답이 되겠습니다.import sys
input = sys.stdin.readline
# 사대의 수, 동물의 수, 사정거리
M, N, L = map(int, input().split())
# 사대의 위치
sadaes = list(map(int, input().split()))
# 이분탐색을 위한 정렬
sadaes.sort()
# 이분탐색
# fire_a <= (사대) <= fire_b 범위에 사대가 있나요?
def binary_search(fire_a, fire_b):
l = 0
r = M - 1
while l <= r:
m = (l + r) // 2
# 사대가 범위 내에 있음
if fire_a <= sadaes[m] <= fire_b:
return True
# 사대가 범위 왼쪽에 있음
elif sadaes[m] < fire_a:
l = m + 1
# 사대가 범위 오른쪽에 있음
else:
r = m - 1
return False
# 동물 수 세기
count = 0
for _ in range(N):
x, y = map(int, input().split())
fire_a = max(sadaes[0], -L + x + y)
fire_b = min(sadaes[-1], L + x - y)
# 해당 동물을 쏠 수 있는 사대가 있는지 확인
if binary_search(fire_a, fire_b):
count += 1
print(count)