코드잇

[코드잇] 분할 정복

오월&절미 2021. 3. 22. 19:19
  • 분할정복은 어떤 문제를 나눌 수 없을 때까지 나누어서 각각을 풀어서 다시 합병하여 문제의 답을 얻는 알고리즘
  • 재귀는 단순히 함수가 자신을 참조하는 것
  • 합병 정렬 : 하나의 리스트를 두 개의 균등한 크기로 분할하고 분할된 부분 리스트를 정렬한 다음, 두 개의 정렬된 부분 리스트를 합하여 전체가 정렬된 리스트가 되게 하는 방법 > 분할, 정복, 결합 의 반복 다시 합병하여 문제의 답을 얻는 알고리즘
def merge(list1, list2):   
    i = 0
    j = 0

    # 정렬된 항목들을 담을 리스트
    merged_list = []

    # list1과 list2를 돌면서 merged_list에 항목 정렬
    while i < len(list1) and j < len(list2):
        if list1[i] > list2[j]:
            merged_list.append(list2[j])
            j += 1
        else:
            merged_list.append(list1[i])
            i += 1

    # list2에 남은 항목이 있으면 정렬 리스트에 추가
    if i == len(list1):
        merged_list += list2[j:]

    # list1에 남은 항목이 있으면 정렬 리스트에 추가
    elif j == len(list2):
        merged_list += list1[i:]

    return merged_list
        
# 합병 정렬
def merge_sort(my_list):
    # 코드를 입력하세요.
    if len(my_list) < 2:
        return my_list
    
    return merge(merge_sort(my_list[:len(my_list)//2]), merge_sort(my_list[len(my_list)//2:]))