Problem

임의의 N개의 숫자가 입력으로 주어집니다.

N개의 수를 오름차순으로 정렬한 다음 N개의 수 중 한 개의 수인 M이 주어지면 이분검색으로 M이 정렬된 상태에서 몇 번째에 있는지 구하는 프로그램을 작성하세요.

단 중복값은 존재하지 않습니다.

 

▣ 입력설명

 

첫 줄에 한 줄에 자연수 N(3<=N<=1,000,000)과 M이 주어집니다.

두 번째 줄에 N개의 수가 공백을 사이에 두고 주어집니다.

 

▣ 출력설명

 

첫 줄에 정렬 후 M의 값의 위치 번호를 출력한다.

 

▣ 입력예제

 

8 32

23 87 65 12 57 32 99 81

 

▣ 출력예제

 

3

 

'이분 검색(Binary Search)' 를 하기 위해서는?


1. 이분 검색을 위해서는 무조건 오름차순/내림차순으로 리스트를 정렬해야한다.
2. 처음에 lt(제일 왼쪽 인덱스 값), rt(제일 오른쪽 인덱스 값)를 설정한다.
3. 해당 리스트의 인덱스에서 가운데 값을 mid로 설정한다. mid=((lt+rt)//2)
4. 반복문을 통해서 리스트의 [mid] 값이 같은지 파악한다.
5. 다르다면, 경우에 따라서 lt rt의 값을 변경하면서 범위를 좁힌다.
6. 리스트의 [mid]값이 찾으려는 값과 같다면 반복문을 종료한다.

import sys
sys.stdin = open('input.txt', 'r')
n, answer = map(int, input().split())
arr = list(map(int, input().split()))

leftP = 0;                          #왼쪽 값
rightP = n-1                        #오른쪽 값

arr.sort()                          # 오름차순 정렬

while leftP <= rightP :             #leftP가 rightP보다 작을때 : 참
    midP = (leftP + rightP) // 2    #중간 값(반복할때마다 갱신)

    if arr[midP] == answer:         #중간 값과 찾고자 하는 값이 동일할 경우
        print(midP+1)               #인덱스 출력
        break
    elif arr[midP] > answer:        #찾는 값이 mid 보다 작은 경우(정답은 mid 왼쪽에 있다)
        rightP = midP - 1           #mid 오른쪽을 버린다(mid 가 맨 오른쪽이 된다)
    else :
        leftP = midP + 1            #찾는 값이 mid 보다 큰 경우(정답은 mid 오른쪽에 있다)

 

참고 - 재귀

def binarySearch(arr, start, end, target):
    global cnt
    mid = (start + end)//2
    mid_value = arr[mid]
    cnt += 1
    if target == mid_value:
        print("%d차 시도 , 탐색 완료 !! 인덱스 번호:%d"%(cnt, mid+1))
        
    elif mid > target:
        end = mid-1
        print("%d차 시도 :"%cnt,start,end)
        binarySearch(arr, start, end, target)
        
    elif mid < target:
        start = mid +1
        print("%d차 시도  :"%cnt, start, end)
        binarySearch(arr, start, end, target)
        
    else:
        return False



arr = [i for i in range(100)]
arr.sort()
target = 15
start = 0
end = len(arr) -1 
cnt = 0
binarySearch(arr, start, end, target)

'코테풀이 > 이분탐색' 카테고리의 다른 글

[백준 | 실버3] 2512: 예산(이분탐색)  (0) 2022.08.26
이분탐색(결정알고리즘) & 그리디 알고리즘_1_이분 검색