이진 탐색

2022. 8. 10. 17:24대학원 입시/알고리즘

1. 백준 1920 수찾기

탐색 데이터수 10만개 X 10만으로 O(N) 연산시 시간초과 발생하여 set 자료형 또는 이진탐색으로 풀이

1. set 자료형 사용

N = int(input())
number_N = set(map(int,input().split()))
M = int(input())
number_M = list(map(int,input().split()))


for m in number_M:
    if m in number_N:
        print(1)
    else :
        print(0)

2. 이진탐색 사용 // 재귀, while문 사용

N = int(input())
number_N = list(map(int, input().split()))
number_N.sort()
M = int(input())
number_M = list(map(int, input().split()))

print(number_N)


def binary_search_while(arr, target, start, end):
    while start <= end:
        mid = (start + end) // 2
        if target == arr[mid]:
            return 1
        elif target < arr[mid]:
            end = mid - 1
        elif target > arr[mid]:
            start = mid + 1
    return 0

def binary_search_recur(arr, target, start, end):
    if start > end:
        return -1
    else :
        mid = (start + end) // 2
        if target == arr[mid]:
            return mid
        elif target < arr[mid]:
            return binary_search_recur(arr, target, start, mid-1)
        elif target > arr[mid]:
            return binary_search_recur(arr, target, mid+1, end)
for i in number_M:
    print(binary_search_while(number_N, i, 0, len(number_N) - 1))
    print(binary_search_recur(number_N, i, 0, len(number_N) - 1))

 

2. 백준 10816 수 찾기 2

딕셔너리 사용하여 해결,

이진탐색시 같은 숫자들을 다시 세는 과정에서 시간 초과발생

 

import sys

N = int(sys.stdin.readline())
numbers_N = list(map(int, sys.stdin.readline().split()))
numbers_N.sort()

M = int(sys.stdin.readline())
numbers_M = list(map(int, sys.stdin.readline().split()))

## dict로 풀이
numbers_N_dict = dict()
for x in numbers_N:
    if x in numbers_N_dict:
        numbers_N_dict[x] += 1
    else:
        numbers_N_dict[x] = 1

for m in numbers_M:
    if m in numbers_N_dict:
        print(str(numbers_N_dict[m]), end=' ')
    else:
        print('0', end=' ')
        
    # binary search로 풀이 -> 시간초과
    # binary_search(numbers_N, m, 0, len(numbers_N) - 1)
    # print(cnt, end=' ')
    
# 이진탐색시 시간초과
def binary_search(arr, target, start, end):
    global cnt
    if start > end:
        return -1
    else:
        mid = (start + end) // 2
        if target == arr[mid]:
            cnt += 1
            temp = mid - 1
            while 0 <= temp and arr[temp] == target:
                cnt += 1
                temp -= 1
            temp = mid + 1
            while temp <= len(numbers_N) - 1 and arr[temp] == target:
                cnt += 1
                temp += 1
            return
        elif target <= arr[mid]:

            return binary_search(arr, target, start, mid - 1)
        else:
            return binary_search(arr, target, mid + 1, end)

3. 백준 1654 랜선 자르기

파라메트릭 서치 : 최적화 문제를 이진탐색 문제로 변환

+1 또는 -1을 더해가면서 탐색하는하지 않고 이진 탐색으로 변환하여 풀이 

import sys
K, N = map(int, sys.stdin.readline().split())
wire = list(map(int, sys.stdin.readlines()))

start = 1
end = max(wire)
max = 0
while True:
    if start > end:
        break
    mid = (start + end) // 2
    line = 0
    for i in range(K):
        line += wire[i] // mid
    if line >= N:
        start = mid + 1
    else:
        end = mid - 1

print(end) #mid 도 동일

 

 

 

https://4legs-study.tistory.com/106

 

최장 증가 수열 (LIS, Longest Increasing Subsequence)

최장 증가 수열 (LIS, Longest Increasing Subsequence) 최장 증가 수열, 정확히 최장 증가 부분 수열은 어떠한 수열에서 오름차순으로 증가하는 가장 긴 부분수열을 의미한다. 이 때, 부분 수열의 각

4legs-study.tistory.com

 

'대학원 입시 > 알고리즘' 카테고리의 다른 글

파이썬 함수 팁  (0) 2022.08.29
Union  (0) 2022.08.12
그래프 최단거리  (0) 2022.08.11
동적 프로그래밍  (0) 2022.08.10
DFS, BFS  (0) 2022.08.09