[SWEA] 5204. [Python S/Wトラブルシューティング実施]4日間-集計ソート[D 3]
9289 ワード
📚 質問する
https://swexpertacademy.com/main/learn/course/subjectDetail.do?courseId=AVuPDYSqAAbw5UW6&subjectId=AWUYFsQq11kDFAVT#
集計ソートの問題を反映します.
分割征服を利用して、一つを二つに分けて、循環運転する.
再回帰の基本条件のため,配列の大きさが1であれば中断する.
1であれば、その時から並べ替えを行い、上昇するタワー方式です.
分けたものを合わせるときは揃え、2つの配列の左側から確認し、より小さな値を入れます.
私たちに参加するために、インデックスを把握しました.両方のインデックスが0から始まり、値を加えると、インデックスごとに1を追加します.
1つの配列のインデックスが配列のサイズより大きい場合は、他のすべての配列が含まれ、終了します.
📒 コード#コード#
def merge_sort(arr): # 분할정복 활용 병합 정렬
global cnt
if len(arr) == 1: # 길이가 1일 때 배열을 리턴
return arr
mid = (len(arr)) // 2 # 길이가 1보다 크면 둘로 나눈다.
left = merge_sort(arr[0:mid]) # 왼쪽 정렬 후 left에 담는다.
right = merge_sort(arr[mid:]) # 오른쪽 정렬 후 right에 담는다.
if left[-1] > right[-1]: # 왼쪽 마지막 원소가 오른쪽 마지막 원소보다 큰 경우 cnt +1
cnt += 1
l, r = 0, 0 # 왼쪽과 오른쪽 인덱스 표시
result = []
while l < len(left) or r < len(right): # l과 r 둘 다 인덱스를 넘어가면 종료
if l == len(left): # l만 인덱스를 넘은 경우
result.append(right[r]) # right에서 꺼내 담는다.
r += 1
elif r == len(right): # r만 인덱스를 넘은 경우
result.append(left[l]) # left에서 꺼내 담는다.
l += 1
elif left[l] > right[r]: # l이 r보다 크면 left에서 꺼내 담는다.
result.append(right[r])
r += 1
elif left[l] <= right[r]: # r이 l보다 크거나 같으면 right에서 꺼내 담는다.
result.append(left[l])
l += 1
return result
t = int(input())
for tc in range(1, t + 1):
n = int(input())
arr = list(map(int, input().split()))
cnt = 0
x = merge_sort(arr)[n // 2]
print(f'#{tc}', x, cnt)
🔍 結果
Reference
この問題について([SWEA] 5204. [Python S/Wトラブルシューティング実施]4日間-集計ソート[D 3]), 我々は、より多くの情報をここで見つけました https://velog.io/@yunhlim/SWEA-5204.-파이썬-SW-문제해결-구현-4일차-병합-정렬-D3テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol