본문 바로가기
  • 초부득3 - 어제보다 나은 내일을 위해
  • 꿈이 현실이 되는 날까지
sw사관학교 정글 2기/02 이분탐색, 분할정복, 스택, 큐, 우선순위 큐

[이분탐색] 백준 8983번 사냥꾼 with Python3 ★

by 금의야행 2021. 8. 17.

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

 

8983번: 사냥꾼

입력의 첫 줄에는 사대의 수 M (1 ≤ M ≤ 100,000), 동물의 수 N (1 ≤ N ≤ 100,000), 사정거리 L (1 ≤ L ≤ 1,000,000,000)이 빈칸을 사이에 두고 주어진다. 두 번째 줄에는 사대의 위치를 나타내는 M개의 x-좌

www.acmicpc.net

문제

 

내 풀이

import sys
input = sys.stdin.readline

m, n, l = map(int, input().split())
shootpos = list(map(int, input().split()))
shootpos.sort()

# 동물을 기준으로 자신을 죽일 수 있는 사대가 있는지를 이분 탐색했다.
# 있을 경우 count가 올라간다.

count = 0
for _ in range(n):
    x, y = map(int, input().split())

    left = 0
    right = len(shootpos)-1
    # print(x, y)

    # 이분 탐색
    if l >= y:

        while left <= right:
            inix = 0
            mid = (left + right) // 2
            inix = shootpos[mid]
            
            if (y <= l and inix-l <= x <= inix + l) and (x - (inix-l) >= y and x - inix + y <= l):
                # x, y가 뾰족한 이등변 삼각형 안에 잘 들어와있는지 체크. 기본적으로 0,0좌표로 옮기고 eg(-inix) 조건을 줬다.

				count += 1
                break

            if x >= inix:
                left = mid + 1

            else:
                right = mid - 1


print(count)

해설

풀이 개념은 조언을 참고하고 구현은 전부 직접했다.

 

생각보다는 쉬운 문제였는데, 시간이 걸리는 부분은 좌표가 사대 사거리 내에 있는지 없는지를 판명하는 조건이었다.

 

사실 좀만 잘 생각했으면 금방 떠올릴 수 있었는데, 아무튼 삼각형의 왼쪽 반은 x >y일때임을 쉽게 알았는데, 반대 쪽 반은 y+x <= L 보다 작을 때임이 잘 생각나지 않았다. 

 

중학교 때 마름모 도형 그래프 그리기 같은 걸로 했었을 텐데... 이 절망적 수학능력...

아무튼 조건 이외에는 이분탐색은 나무자르기와 같이 기본적인 이분탐색과 매우 유사했다고 본다.

 

정답 풀이

#내 답이 마음에 들어서 아직은 다른 답은 안찾아보겠다.

출처:

 

해석

 

댓글