Odds and Ends

백준 : 11663번 선분 위의 점 [파이썬, 실버3, 이분탐색] 본문

코딩 테스트

백준 : 11663번 선분 위의 점 [파이썬, 실버3, 이분탐색]

Squidward 2022. 8. 8. 18:55

문제

일차원 좌표상의 점 N개와 선분 M개가 주어진다. 이때, 각각의 선분 위에 입력으로 주어진 점이 몇 개 있는지 구하는 프로그램을 작성하시오.

입력

첫째 줄에 점의 개수 N과 선분의 개수 M이 주어진다. (1 ≤ N, M ≤ 100,000) 둘째 줄에는 점의 좌표가 주어진다. 두 점이 같은 좌표를 가지는 경우는 없다. 셋째 줄부터 M개의 줄에는 선분의 시작점과 끝점이 주어진다. 입력으로 주어지는 모든 좌표는 1,000,000,000보다 작거나 같은 자연수이다.

출력

입력으로 주어진 각각의 선분 마다, 선분 위에 입력으로 주어진 점이 몇 개 있는지 출력한다.

예제 입력 

5 5
1 3 10 20 30
1 10
20 60
3 30
2 15
4 8

예제 출력 

3
2
4
2
0

 

[문제 풀이]

find라는 이분 탐색 함수로 가장 근접한 값을 찾아낸다.

시작점이 결과보다 작거나 같게 끝 점은 결과보다 크거나 같게 해야지

선분 위의 좌표를 커버할 수 있다. 찾은 인덱스를 빼서 1을 더하면 개수를 구할 수 있다.

def find(n, points, target):
    start, end = 0, n - 1
    while start < end:
        mid = (start + end) // 2
        if target < points[mid]:
            end = mid - 1
        elif target > points[mid]:
            start = mid + 1
        else:
            return mid
    return start

n, m = sorted(map(int, input().split()))
points = sorted(map(int, input().split()))

for _ in range(m):
    s, e = map(int, input().split())

    result = find(n, points, s)
    si = result if points[result] >= s else result + 1

    result = find(n, points, e)
    ei = result if points[result] <= e else result - 1

    print(ei - si + 1)
728x90