문제 설명
어떤 사람이 사전에서 단어를 찾고 싶어합니다. 이 사전은 알파벳 순서로 정렬된 단어들이 들어 있습니다. 주어진 단어에 대해 사전에서 그 단어가 처음으로 나타나는 위치를 찾는 프로그램을 작성하세요.
입력으로는 정렬된 단어 목록과 찾고자 하는 단어가 주어집니다. 찾고자 하는 단어가 사전에 존재하지 않으면 -1
을 리턴합니다.
입력 형식
- 단어 목록:
words
(리스트 형태, 각 단어는 문자열로 구성) - 찾고 싶은 단어:
target
(문자열)
출력 형식
목록에서 찾고 싶은 단어의 인덱스 (0-based index)를 리턴. 단어가 존재하지 않으면 -1
을 리턴.
예제
입력: words = ["apple", "banana", "cherry", "date", "fig", "grape"] target = "cherry" 출력: 2
문제 접근
이 문제는 이진 탐색(Binary Search) 알고리즘을 사용하여 해결할 수 있습니다. 이진 탐색은 정렬된 데이터에서 특정 값을 빠르게 찾는 데 유용한 알고리즘으로, 시간 복잡도는 O(log n)입니다.
이진 탐색 알고리즘 개요
이진 탐색은 다음과 같은 절차로 진행됩니다:
- 리스트의 중간 요소를 찾습니다.
- 중간 요소가 찾고자 하는 값과 일치하는지 확인합니다.
- 일치하면 중간 요소의 인덱스를 리턴합니다.
- 일치하지 않으면 찾고자 하는 값이 중간 요소보다 작으면 중간 요소 이전 부분에서, 크면 중간 요소 이후 부분에서 검색을 계속합니다.
- 이 조건을 만족할 때까지 위의 과정을 반복합니다.
구현
여기서는 파이썬을 사용하여 이진 탐색 알고리즘을 구현하겠습니다. 아래는 이진 탐색을 사용한 사전 찾기 함수입니다.
def binary_search(words, target):
left, right = 0, len(words) - 1
while left <= right:
mid = (left + right) // 2
if words[mid] == target:
return mid
elif words[mid] < target:
left = mid + 1
else:
right = mid - 1
return -1
코드 설명
위의 binary_search
함수는 다음과 같이 작동합니다:
left
와right
변수를 사용하여 검색 범위를 설정합니다. 초기값은 각각 0과len(words) - 1
입니다.while left <= right
루프를 사용하여 검색 범위가 유효할 때까지 반복합니다.- 중간 인덱스
mid
를 계산합니다 (정수 나누기를 통해). - 만약
words[mid]
가target
와 같다면mid
를 리턴하여 인덱스를 반환합니다. - 그렇지 않으면
words[mid]
가target
보다 작으면left
를mid + 1
으로 업데이트하고, 크면right
를mid - 1
로 업데이트합니다. - 모든 반복이 끝났는데도 찾고자 하는 단어가 없으면
-1
을 리턴합니다.
테스트 케이스
코드의 기능을 테스트하기 위해 몇 가지 케이스를 추가해보겠습니다.
if __name__ == "__main__":
words = ["apple", "banana", "cherry", "date", "fig", "grape"]
target = "cherry"
result = binary_search(words, target)
print(f"'{target}'는 인덱스 {result}에 있습니다.") # 출력: 'cherry'는 인덱스 2에 있습니다.
target = "orange"
result = binary_search(words, target)
print(f"'{target}'는 인덱스 {result}에 있습니다.") # 출력: 'orange'는 인덱스 -1에 있습니다.
결론
이번 강좌에서는 파이썬의 이진 탐색 알고리즘을 사용하여 주어진 사전에서 특정 단어를 찾는 문제를 해결했습니다. 이 알고리즘은 정렬된 리스트에서 빠르게 값을 찾는 데 유용하며, 다양한 문제에 적용할 수 있습니다. 이진 탐색을 이해하고 활용하는 능력은 코딩 테스트 및 실제 프로그래밍에서 큰 도움이 됩니다.