데이터 분석이나 엔지니어링을 하다 보면 데이터 속에서 특정 값을 빠르게 찾는 일이 자주 필요.
예를 들어, 로그 데이터에서 특정 사용자 ID를 찾거나, CSV에서 특정 열 값이 있는 행을 찾는 경우가 그렇다.
이때 가장 단순하게 적용할 수 있는 방법이 바로 선형검색(linear search)
탐색 결과
데이터: 3 2 5 7 9 1 0 8 6 4
인덱스: [0][1][2][3][4][5][6][7][8][9]
7
을 찾을 경우: 인덱스 0 → 1 → 2 → 3 에서 성공 i < len(nums)
같은 경계 조건을 검사하지 않아도 됨.데이터: 3 2 5 7 9 1 0 8 6 4 9
인덱스: [0] [1] [2] [3] [4] [5] [6] [7] [8] [9] [10]
7
찾기nums = [4, 7, 10, 2, 4, 7, 0, 2, 7, 3, 9]
target = 7
searchResultIdx = -1 # 기본값: 못 찾았을 때 -1
for i, x in enumerate(nums):
if x == target:
searchResultIdx = i
break
print("리스트:", nums)
print("리스트 길이:", len(nums))
print("찾은 인덱스:", searchResultIdx)
print("검색 결과:", f"{target} 값은 {searchResultIdx}번 인덱스에 있음." if searchResultIdx != -1 else "값이 리스트에 없음.")
리스트: [4, 7, 10, 2, 4, 7, 0, 2, 7, 3, 9]
리스트 길이: 11
찾은 인덱스: 1
검색 결과: 7 값은 1번 인덱스에 있음.
nums = [4, 7, 10, 2, 4, 7, 0, 2, 7, 3, 9]
target = 7
positions = [i for i,x in enumerate(nums) if x == target]
print("리스트:", nums)
print("리스트 길이:", len(nums))
print("찾은 인덱스들:", positions)
print("검색 개수:", len(positions))
리스트: [4, 7, 10, 2, 4, 7, 0, 2, 7, 3, 9]
리스트 길이: 11
찾은 인덱스들: [1, 5, 8]
검색 개수: 3
데이터: 1 2 3 4 5 6 7 8 9
인덱스: [0][1][2][3][4][5][6][7][8]
-> 찾는 값: 2
1. 중앙값 = 5 → 2 < 5 → 왼쪽 구간 [1, 2, 3, 4, 5]
2. 새로운 중앙값 = 3 → 2 < 3 → 왼쪽 구간 [1, 2, 3]
3. 새로운 중앙값 = 2 → target과 일치 → 탐색 성공
def binary_search(nums, target):
left, right = 0, len(nums) - 1
while left <= right:
mid = (left + right) // 2 # 중앙값 인덱스
if nums[mid] == target:
return mid # 탐색 성공
elif nums[mid] < target:
left = mid + 1 # 오른쪽 범위로 이동
else:
right = mid - 1 # 왼쪽 범위로 이동
return -1 # 탐색 실패
# --- 데모 ---
nums = [1, 2, 3, 4, 5, 6, 7, 8, 9]
print("리스트:", nums)
target = 2
idx = binary_search(nums, target)
print(f"검색 결과: {target} 값은 {idx}번 인덱스에 있음." if idx != -1 else "값이 리스트에 없음.")
리스트: [1, 2, 3, 4, 5, 6, 7, 8, 9]
검색 결과: 2 값은 1번 인덱스에 있음.
7
을 이진검색을 이용해 찾고, 그 위치(인덱스)를 출력하는 프로그램을 작성.nums = [4, 10, 22, 5, 0, 17, 7, 11, 9, 61, 88]
# 오름차순
print("정렬 후 리스트:", nums.sort())
# 이진검색 함수
def binary_search(nums, target):
left, right = 0, len(nums) - 1
while left <= right:
mid = (left + right) // 2 # 중앙값 인덱스
if nums[mid] == target:
return mid # 탐색 성공
elif nums[mid] < target:
left = mid + 1 # 오른쪽 탐색
else:
right = mid - 1 # 왼쪽 탐색
return -1 # 탐색 실패
# 타겟 검색
target = 7
idx = binary_search(nums, target)
print("찾는 값:", target)
print("찾은 인덱스:", idx)
print("검색 결과:", f"{target} 값은 {idx}번 인덱스에 있음." if idx != -1 else "값이 리스트에 없음.")
정렬 전 리스트: [4, 10, 22, 5, 0, 17, 7, 11, 9, 61, 88]
정렬 후 리스트: [0, 4, 5, 7, 9, 10, 11, 17, 22, 61, 88]
찾는 값: 7
찾은 인덱스: 3
검색 결과: 7 값은 3번 인덱스에 있음.