< 이 글은 책 '이것이 취업을 위한 코딩 테스트다' 에서 발췌한 내용을 인용했습니다. >
순차 탐색
순차 탐색이란 리스트 안에 있는 특정한 데이터를 찾기 위해 앞에서부터 데이터를 하나씩 차례대로 확인하는 방법이다.
리스트에 특정 값의 원소가 있는지 체크할 때, count() 메서드를 이용할 때 등에서 순차 탐색이 실행된다.
<순차 탐색 소스코드>
def sequential_search(n, target, array):
for i in range(n):
if array[i] == target:
return i+1
print("생성할 원소 개수를 입력한 다음 한 칸 띄고 찾을 문자열을 입력하시오.")
input_data = input().split()
n = int(input_data[0])
target = input_data[1]
print("앞서 저은 원소 개수만큼 문자열을 입력하시오. 구분은 띄어쓰기 한 칸으로 합니다.")
array = input().split()
print(sequential_search(n, target, array))
순차 탐색은 최악의 경우 시간 복잡도는 O(N)이다.
이진 탐색
이진 탐색이란 탐색하고자 하는 범위의 시작점, 끝점, 그리고 중간점을 변수로 사용해서, 찾으려는 데이터와 중간점 위치에 있는 데이터를 반복적으로 비교해서 원하는 데이터를 찾는 알고리즘이다.
리스트에 특정 값의 원소가 있는지 체크할 때, count() 메서드를 이용할 때 등에서 순차 탐색이 실행된다.
<이진 탐색 with 재귀함수>
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)
array = [1, 2, 3, 4, 5]
n = int(input())
result = binary_search(sorted(array), n, 0, len(array) - 1)
if result == None: print('원소가 존재하지 않습니다.')
else: print(result + 1)
<이진 탐색 with 반복문>
array = [1, 2, 3, 4, 5]
target = int(input())
start = 0
end = len(array) - 1
result = None
while start <= end:
mid = (start + end) // 2
if array[mid] == target:
result = mid + 1
break
elif array[mid] > target: end = mid - 1
else: start = mid + 1
if result == None: print("찾으시는 원소가 없습니다.")
else: print(result)
이진 탐색 알고리즘은 한 단계를 거칠 때마다 확인하는 원소가 평균적으로 절반으로 줄어든다.
따라서 이진 탐색의 시간 복잡도는 O(logN)이다.
코딩 테스트의 이진 탐색 문제는 탐색 범위가 큰 상황에서의 탐색을 가정하는 문제가 많다. 따라서 탐색 범위가 2,000만을 넘어가면 이진 탐색으로 문제에 접근하기를 추천한다. 이와 같이 처리해야할 데이터의 개수나 값이 1,000만 단위 이상으로 넘어가면 이진 탐색과 같이 O(logN)의 속도를 내야하는 알고리즘을 떠올려야 문제를 풀 수 있는 경우가 많다는 점을 기억하자.
빠르게 입력 받기
이진 탐색 문제는 입력 데이터가 많거나 탐색 범위가 매우 넓은 편이다. 이렇게 입력 데이터의 개수가 ㅁ낳은 문제에 input() 함수를 사용하면 동작속도가 느려 시간 초과가 될 수 있다. 따라서 입력 데이터가 많은 문제는 sys 라이브러리의 readline() 함수를 이용하면 시간 초과를 피할 수 있다.
<한 줄 입력받아 출력하는 소스코드>
import sys
# 하나의 문자열 데이터 입력받기
input_data = sys.stdin.readline().rstrip()
# 입력받은 문자열 그대로 출력
print(input_data)
sys 라이브러리를 사용할 때는 한 줄 입력받고 나서 꼭 rstrip() 함수를 꼭 호출해야 한다. 소스코드에 readline()으로 입력하면 입력 후 엔터가 줄 바꿈 기호로 입력되는데, 이 공백 문자를 제거하려면 rstrip() 함수를 사용해야 한다.
'이것이 취업을 위한 코딩테스트다 with 파이썬' 카테고리의 다른 글
Chapter 7-3 떡볶이 떡 만들기 (0) | 2023.02.02 |
---|---|
Chapter 7-2 부품 찾기 (0) | 2023.02.01 |
Chapter 6-4 두 배열의 원소 교체 (0) | 2023.01.30 |
Chapter 6-3 성적이 낮은 순서로 학생 출력하기 (0) | 2023.01.29 |
Chapter 6-2 위에서 아래로 (0) | 2023.01.28 |