정구리의 우주정복
[알고리즘 기초] 이진 탐색 파이썬 코드 본문
반응형
이진 탐색은 반으로 쪼개가면서 탐색을 하는 방식이다
*내부의 데이터가 정렬되어야만 사용이 가능하다는 특징이 있음
시작 , 끝 , 중간 데이터가 있어야 한다
찾으려는 데이터와 중간점의 데이터를 비교하고 다시 시작 , 끝 , 중간 을 조절해주면서 범위를 좁혀가는 탐색 방법이다
0 2 4 6 8 10 12 14 16 18 중에서 4 를 찾고자 한다면
0 2 4 6 8 10 12 14 16 18
처음값 0 중간값 8 끝값 18 일때 찾으려는 4 보다 중간값인 8 이 더 크므로 더이상 8-16 까지의 데이터는 볼 필요가 없다
그리고 끝 값을 8의 하나 앞인 인 6으로 해주자
0 2 4 6 8 10 12 14 16 18
처음 값 0 중간값 2 끝값 6 일때 4는 중간값인 2보다 크므로 0-2 까지 의 데이터는 볼 필요가 없다
그리고 시작 값을 2의 하나 앞인 4로 해주자
0 2 4 6 8 10 12 14 16 18
처음값 4 중간값 4 끝값 6 중간점에 위치한 데이터 4 는 찾으려는것과 동일하므로 탐색을 종료한다
파이썬 코드 2가지
1. 재귀
#이진 탐색 소스코드 구현 (재귀함수)
def binary_search(array,target,start,end):
if start>end :
return None
mid = (start+end) // 2
#찾은 경우 중간점 인덱스 반환
if array[mid] == target :
return mid
#중간점의 값보다 찾고자 하는 값이 작은 경우 왼쪽 확인
elif array[mid] > target :
return binary_search(array,target,start,mid-1)
#큰 경우 오른쪽 확인
else:
return binary_search(array,target,mid+1,end)
n,target = list(map(int,input().split()))
#전체 원소 입력
array = list(map(int,input().split()))
result = binary_search(array,target,0,n-1)
if result == None:
print("원소가 없습니다")
else:
print(result+1)
2. 반복문
#이진 탐색 소스코드 구현 (반복문)
def binary_search(array,target,start,end):
while start <= end :
mid = (start+end) // 2 #중간점 찾기
#찾은 경우 중간점 인덱스 반환
if array[mid] == target :
return mid
#중간점의 값보다 찾고자 하는 값이 작은 경우 왼쪽 확인
elif array[mid] > target:
end = mid -1
#중간점의 값보다 찾고자 하는 값이 큰 경우 왼쪽 확인
else:
start = mid +1
return None
n, target = list(map(int,input().split()))
array = list(map(int,input().split()))
result = binary_search(array,target,0,n-1)
if result == None :
print("원소가 존재하지 않습니다")
else:
print(result + 1)
반응형
'ALGORITHM > BASIC' 카테고리의 다른 글
최단경로 알고리즘(다익스트라 파이썬) (0) | 2021.01.21 |
---|---|
코딩테스트 스킬 모음 (계속 업데이트할 예정) (0) | 2021.01.07 |
[파이썬] 성적 낮은 순서로 이름 출력하기 (0) | 2020.09.02 |
구현 - 상하좌우 로 이동하는 문제 (0) | 2020.08.28 |
그리디 알고리즘 기초 - 거스름돈 (0) | 2020.08.28 |
Comments