나동빈님의 책과 유튜브 강의인 '이것이 코딩 테스트다'를 바탕으로 스스로 공부한 내용을 정리한 글입니다.
참고한 영상의 링크는 아래와 같습니다.
이것이 코딩테스트다 - 이진탐색 알고리즘
input_data = input().split()
n = int(input_data[0])
target = str(input_data[1])
array = input().split()
def sequential_search(n, target, array):
for i in range(n):
if array[i] == target:
return i + 1
return None
print(sequential_search(n, target, array))
n, target = list(map(int, input().split()))
array = list(map(int, input().split()))
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)
result = binary_search(array, target, 0, n - 1)
if result == None:
print("No 원소")
else:
print(result + 1)
- 리스트가 정렬되어 있다는 가정하여 target과 중간점을 비교하여 데이터를
- (1) 중간점과 같으면 return (2) 중간점과 큰 데이터들과 비교를 지속할지 (3) 중간점보다 작은 데이터들과 비교를 지속할지를 결정한다.
- 재귀함수를 통해 logN의 시간복잡도를 보장해준다.
from bisect import bisect_left, bisect_right
def count_by_range(a, left_value, right_value):
# 정렬된 순서를 유지한 채 배열 a에 x를 삽입할 가장 오른쪽 idx 반환
right_index = bisect_right(a, right_value)
# 정렬된 순서를 유지한 채 배열 a에 x를 삽입할 가장 왼쪽 idx 반환
left_index = bisect_left(a, left_value)
return right_index - left_index
a = [1,2,3,3,3,3,4,4,8,9]
print(count_by_range(a,4,4))
n, target = list(map(int, input().split()))
array = list(map(int, input().split()))
start = 0
end = max(array)
result = 0
while (start <= end):
total = 0
mid = (start + end) // 2
for x in array:
if x > mid:
total += (x - mid)
if total < target:
# mid 기준으로 모든 합이 target보다 적으면 mid가 크다는 의미 > mid를 감소
end = mid - 1
else:
# mid 기준으로 모든 합이 target보다 크거나 같다
# 현재 mid가 가장 좋은 point가 될 수 있지만 증가 가능성 있음 > mid를 증가
result = mid
start = mid + 1
print(result)
from bisect import bisect_left, bisect_right
def count_by_range(a, left_value, right_value):
right_index = bisect_right(a, right_value)
left_index = bisect_left(a, left_value)
return right_index - left_index
n,x = list(map(int, input().split()))
array = list(map(int, input().split()))
count = count_by_range(array, x, x)
if count == 0:
print(-1)
else:
print(count)
이 문제의 KEY는 일반적인 선형탐색을 하면, 시간초과판정을 받기 때문에 O(LogN)으로 탐색으로 수행하는 이진탐색 알고리즘을 사용해야 한다라는 제한조건이 존재한다.