# 분할 단계
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 |