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