알고리즘

자료구조와 알고리즘 -배열(배열 삽입 위치, 병합)

앨리스.W 2021. 7. 13. 22:12

<배열에서 삽입 위치 찾기>

문제) nums = [1,2,3,4,5], target =3 

       target의 위치는?


풀이)

'이진탐색'이용 -> 가운데 숫자에 먼저 접근해서 target 값과 비교하고 큰 파트 와 작은 파트로 나누고 해당되는 파트를 찾아간 다음 그 파트이 가운데 숫자와 target값을 비교하면서 위치를 찾아가는 방법

 

(1) 선형순회

def searchInsert(nums: list, target:int) -> int:
    index = 0
    
    while index < len(nums):
        if target <= nums[index]:
            break
            
        index += 1
        
    return index

 

(2) 이진탐색

def BsearchInsert(nums:list, target: int) -> int:
    low =0
    high = len(nums) -1
    
    while low <= high:
        mid = int((low + high)/2)     #mid 값 구하기
        
        if target == nums[mid]:
            return mid
        if target > nums[mid]:       #target값이 mid보다 크면
            low = mid +1            
        else:                              #target값이 mid보다 작으면
            high = mid -1
            
    return low


<정렬된 배열의 병합>

 문제) num1, num2 두 배열을 병합(정렬된 상태)

참고자료 : 쓰면서 익히는 알고리즘 구조


풀이)

(1) sorted 함수 사용해서 병합하고 정렬(실행이 안됨)

def merge(nums1: list, m: int, nums2:list, n: int) -> None:
    for i, v in enumerate(nums2):
        nums1[m+i] =v
        
    nums1[:] = sorted(nums1)

 

(2) 비교 및 삽입(이해가안됨)

def merge(nums1: list, m:int, nums2: list, n:int) -> None:
    i = m-1
    j = n-1
    k = m+n-1
    
    while i >= 0 and j >= 0:
        if nums1[i] < nums2[j]:
            nums1[k] = nums2[j]
            j -= 1
        else:
            nums1[k] = nums1[i]
            i -=1
            
        k -= 1
        
    while j >= 0:
        nums1[k] = nums2[j]
        k -= 1
        j -= 1

반응형