Algorithm/SW Expert Academy

[Python] 5204. 병합 정렬

느낌표 공장장 2021. 10. 7. 01:36
# 분할 단계
def merge_sort(arr):
    if len(arr) <= 1:   # 길이가 1이 될때까지 분할하는거야
        return arr

    middle = len(arr) // 2  # 중심을 기준으로 두개의 구간으로 나누기
    left = merge_sort(arr[:middle])
    right = merge_sort(arr[middle:])
    return merge(left, right)   # 병합 고고


# 병합 단계
def merge(left, right):
    global answer

    if right[-1] < left[-1]:    # 왼쪽 마지막 원소가 오른쪽 마지막 원소보다 큰 경우 count
        answer += 1

    # pop(0) 대신 인덱스로 접근, append 사용
    result = []
    len_l = len(left)
    len_r = len(right)
    l = r = 0
    while l < len_l or r < len_r:       # left, right에 추가할 원소 남아있을 때까지 반복
        if l < len_l and r < len_r:     # left, right에 둘다 원소가 남아 있다면
            if left[l] <= right[r]:     # 왼쪽이 작은 경우
                result.append(left[l])  # 왼쪽 값 추가
                l += 1  # left의 다음 원소 지목
            else:
                result.append(right[r]) # 오른쪽이 작은 경우, 오른쪽 값 추가
                r += 1  # right의 다음 원소 지목

        elif l < len_l: # left에만 원소 남아있는 경우
            result.append(left[l])
            l += 1
        elif r < len_r: # right에만 원소 남아있는 경우
            result.append(right[r])
            r += 1

    return result


tc = int(input())
for idx in range(1, tc+1):
    n = int(input())
    arr = list(map(int, input().split()))

    answer = 0
    result = merge_sort(arr)

    print('#{} {} {}'.format(idx, result[n//2], answer))

 

병합 단계 함수에서 인덱스로만 접근하는 코드 (append 함수 X)

def merge2(left, right):
    global answer

    if right[-1] < left[-1]:    # 왼쪽 마지막 원소가 오른쪽 마지막 원소보다 큰 경우 count
        answer += 1

    # 인덱스로만 접근
    len_l = len(left)
    len_r = len(right)
    result = [0 for _ in range(len_l+len_r)]
    l = r = i = 0
    while l < len_l or r < len_r:       # left, right에 추가할 원소 남아있을 때까지 반복
        if l < len_l and r < len_r:     # left, right에 둘다 원소가 남아 있다면
            if left[l] <= right[r]:     # 왼쪽이 작은 경우
                result[i] = left[l]     # 왼쪽 값 추가
                i += 1      # result 다음 자리로 이동
                l += 1      # left의 다음 원소 지목
            else:
                result[i] = right[r]    # 오른쪽이 작은 경우, 오른쪽 값 추가
                i += 1      # result 다음 자리로 이동
                r += 1      # right의 다음 원소 지목

        elif l < len_l:     # left에만 원소 남아있는 경우
            result[i] = left[l]
            i += 1
            l += 1

        elif r < len_r:     # right에만 원소 남아있는 경우
            result[i] = right[r]
            i += 1
            r += 1

    return result

'Algorithm > SW Expert Academy' 카테고리의 다른 글

[Python] 5207. 이진탐색  (0) 2021.10.07
[Python] 5205. 퀵 정렬  (0) 2021.10.07
[Python] 5203. 베이비진 게임  (0) 2021.10.05
[Python] 5202. 화물도크  (0) 2021.10.05
[Python] 5201. 컨테이너운반  (0) 2021.10.05