#선형탐색 (Linear Search)
def linear_search(L,x):
i=0 #index i를 0으로 준다
while i < len(L) and L[i] != x: #i가 L리스트의 길이보다 작고, L의 i번째 원소가 x와 같지 않을때
i += 1 #i를 1씩 증가시켜나간다.
#원소가 발견되면 i값을 가지고 loop가 종료하게 될 것이기 때문에
#i가 L리스트의 길이보다 짧으면 리스트 안에서 원소를 발견했다는 의미
if i < len(L):
return i #발견된 x를 리턴하고
else:
return -1 #그렇지 않으면 -1을 리턴한다.
S = [3,8,2,7,6,7,6,10,9]
linear_search(S,6)
#Out: 4
S = [3,8,2,7,6,7,6,10,9]
linear_search(S,1)
#Out: -1
#이진 탐색 (Binary Search)
-Divide & Conquer : 정렬되어 있을때만 가능 → O(log n)
#이미 정렬된 리스트 L에서 x를 이진 탐색으로 찾기
#리스트에 없을 경우 -1 반환
def solution(L, x):
answer = -1
lt=0
rt=len(L)-1
while lt<=rt:
mid = (lt+rt)//2
if L[mid] == x:
answer = mid
break
elif L[mid]>x:
rt=mid-1
else:
lt=mid+1
return answer
#L 리스트 내 n개 숫자 중 target 위치를 이분 검색으로 찾기
n, target = map(int,input().split())
L = list(map(int,input().split()))
L.sort() #L을 순차로 정렬
lt=0 #lt는 가장 왼쪽 위치
rt=n-1 #lt는 가장 오른쪽 위치
while lt<=rt:
mid = (lt+rt)//2 #중간 값을 구함 : 몫을 구함
if L[mid] == target: #mid가 target이면 답을 찾은 것
print(mid+1) #mid는 index(0번 부터 시작)이기 때문에 +1
break
elif L[mid]>target:
#mid가 target보다 크면 lt...target..mid ...rt
#mid 왼쪽 탐색
rt=mid-1 #mid index에서 -1함으로써 mid보다 큰 쪽을 다 날림. rt가 mid-1값으로 조정됨
else:
#mid가 target보다 작면 lt.....mid ..target..rt
#mid 오른쪽 탐색
lt=mid+1 #mid위치에서 +1함으로써 mid+1위치부터 오른쪽으로 탐색
#Iput: 8 32
#Iput: 23 87 65 12 57 32 99 81
#Out: 3 (정렬 후의 결과이므로 작은 수로부터 3번째 큰 자리가 출력됨)
'Python > Data Structure & Algorithm in Python' 카테고리의 다른 글
[Python 자료구조] 연결리스트 (Linked List) (0) | 2020.09.09 |
---|---|
[Algorithm] 동적계획법(Dynamic programming) - Brute Force, Kadane’s Algorithm (0) | 2020.09.06 |
[Python 기초] 재귀 알고리즘 (recursive algorithms) (0) | 2020.09.06 |
[Python 기초] 정렬 (sort) (0) | 2020.09.05 |
[Python 기초] 연결리스트 (Linked List) (0) | 2020.08.10 |
댓글