블로그를 이전 중이라 완료되기 전까지는 벨로그에 작성할 계획입니다.
이후 모든 글은 https://weekwith.me 에 작성 예정이니 다른 글이 궁금하시다면 해당 링크를 통해 방문해주세요.본 글은 [ LeetCode ] 35. Search Insert Position을 풀고 작성한 글입니다.
Given a sorted array of distinct integers and a target value, return the index if the target is found. If not, return the index where it would be if it were inserted in order.
You must write an algorithm with O(log n)
runtime complexity.
1 <= nums.length <= 104
-104 <= nums[i] <= 104
nums
contains distinct values sorted in ascending order.-104 <= target <= 104
이진 탐색을 통해 문제를 풀면 된다.
이때 target
값이 nums
배열 내에 존재하지 않을 경우 이진 탐색의 대상이 되는 middle
인덱스 요소의 값이 target
값보다 큰 경우와 작은 경우를 나눠서 생각해야 한다.
먼저 middle
인덱스 요소의 값이 target
값보다 큰 경우 계속해서 범위를 줄여나가며 삽입해야 할 인덱스를 찾아야하기 때문에 end
값을 middle
값에 1
을 뺀 걸로 재할당하고 middle
값을 변수 answer
에 while
반복문이 반복될 동안 계속 재할당한다.
반대로 middle
인덱스 요소의 값이 target
값보다 작은 경우 계속해서 범위를 넓혀나가며 삽입해야 할 인덱스를 찾아야하기 때문에 start
값을 middle
값에 1
을 더한 걸로 재할당하고 middle
값에 1
을 더한 값을 변수 answer
에 while
반복문이 반복될 동안 계속 재할당한다.
접근법을 토대로 문제를 해결하면 아래와 같다.
def solution(nums: list[int], target: int) -> int:
start, end, answer = 0, len(nums)-1, 0
while start <= end:
middle = (start + end) // 2
if nums[middle] == target:
return middle
elif nums[middle] > target:
answer = middle
end = middle - 1
else:
answer = middle + 1
start = middle + 1
return answer
아래와 같이 파이썬 내장 모듈인 bisect
내에 있는 bisect_left
메서드를 사용하여 문제를 쉽게 풀 수도 있다.
def another_solution(nums: list[int], target: int) -> int:
from bisect import bisect_left; return bisect_left(nums, target)
이와 같이 문제를 풀 경우 시간 복잡도는 문제에서 요구한 것과 같이 O(logN)이다.