Table of contents
Open Table of contents
python 코드
import time, random, unittest
def get_merge_sorted(arr):
    if len(arr) <= 1:
        return arr
    mid = len(arr) // 2
    left_arr = get_merge_sorted(arr[:mid])
    right_arr = get_merge_sorted(arr[mid:])
    def merge(left, right):
        merged_arr = []
        left_idx, right_idx = 0, 0
        while left_idx < len(left) and right_idx < len(right):
            if left[left_idx] < right[right_idx]:
                merged_arr.append(left[left_idx])
                left_idx += 1
            else:
                merged_arr.append(right[right_idx])
                right_idx += 1
        # 여기로 왔다는 말은
        # left, right 둘 중 하나는 끝까지 다 돌았다는 뜻
        # 둘 중 하나만 돌았을 때는 위의 while문에서 이미 merged_arr에 추가가 되었기 때문에
        # 둘 중 하나만 돌았을 때는 그냥 나머지를 다 넣어주면 된다.
        while left_idx < len(left):
            merged_arr.append(left_arr[left_idx])
            left_idx += 1
        while right_idx < len(right):
            merged_arr.append(right_arr[right_idx])
            right_idx += 1
        return merged_arr
    partial_merged_list = merge(left_arr, right_arr)
    MergeSortTest.sort_procedure.append(partial_merged_list)
    return partial_merged_list
class MergeSortTest(unittest.TestCase):
    @classmethod
    def setUpClass(cls) -> None:
        print("0~1000까지의 정수 50개를 랜덤으로 생성합니다.")
        cls.random_numbers = [random.randint(0, 1000) for _ in range(50)]
        cls.sorted_random_numbers = sorted(cls.random_numbers)
        cls.sort_procedure = []
        print("Merge Sort 테스트 시작")
    @classmethod
    def tearDownClass(cls) -> None:
        print("\nMerge Sort 테스트 종료\n")
        print("Merge Sort 과정을 출력합니다.")
        for i, procedure in enumerate(cls.sort_procedure):
            print(f"{i + 1}번째 과정: {procedure}")
    def setUp(self) -> None:
        self.start_time = time.time()
    def tearDown(self) -> None:
        self.end_time = time.time()
        print(f"\n테스트 소요 시간: {self.end_time - self.start_time:4f}s")
    def test_merge_sort(self):
        self.assertEqual(
            get_merge_sorted(MergeSortTest.random_numbers),
            MergeSortTest.sorted_random_numbers,
        )
if __name__ == "__main__":
    unittest.main(verbosity=2)
How to Run
python version: 3.11.6
Run main.py
pip install pipenv
pipenv --python 3.11.6
pipenv run python3 main.py
Output
Loading .env environment variables...
0~1000까지의 정수 50개를 랜덤으로 생성합니다.
Merge Sort 테스트 시작
test_merge_sort (__main__.MergeSortTest.test_merge_sort) ...
테스트 소요 시간: 0.000105s
ok
Merge Sort 테스트 종료
Merge Sort 과정을 출력합니다.
1번째 과정: [558, 738]
2번째 과정: [558, 738, 928]
3번째 과정: [0, 668]
4번째 과정: [0, 668, 833]
5번째 과정: [0, 558, 668, 738, 833, 928]
6번째 과정: [589, 753]
7번째 과정: [287, 589, 753]
8번째 과정: [462, 951]
9번째 과정: [274, 462, 951]
10번째 과정: [274, 287, 462, 589, 753, 951]
11번째 과정: [0, 274, 287, 462, 558, 589, 668, 738, 753, 833, 928, 951]
12번째 과정: [124, 886]
13번째 과정: [89, 124, 886]
14번째 과정: [422, 799]
15번째 과정: [422, 475, 799]
16번째 과정: [89, 124, 422, 475, 799, 886]
17번째 과정: [236, 768]
18번째 과정: [236, 325, 768]
19번째 과정: [195, 322]
20번째 과정: [406, 788]
21번째 과정: [195, 322, 406, 788]
22번째 과정: [195, 236, 322, 325, 406, 768, 788]
23번째 과정: [89, 124, 195, 236, 322, 325, 406, 422, 475, 768, 788, 799, 886]
24번째 과정: [0, 89, 124, 195, 236, 274, 287, 322, 325, 406, 422, 462, 475, 558, 589, 668, 738, 753, 768, 788, 799, 833, 886, 928, 951]
25번째 과정: [368, 414]
26번째 과정: [72, 368, 414]
27번째 과정: [373, 825]
28번째 과정: [373, 800, 825]
29번째 과정: [72, 368, 373, 414, 800, 825]
30번째 과정: [346, 450]
31번째 과정: [24, 346, 450]
32번째 과정: [731, 909]
33번째 과정: [483, 731, 909]
34번째 과정: [24, 346, 450, 483, 731, 909]
35번째 과정: [24, 72, 346, 368, 373, 414, 450, 483, 731, 800, 825, 909]
36번째 과정: [423, 836]
37번째 과정: [125, 423, 836]
38번째 과정: [28, 665]
39번째 과정: [28, 505, 665]
40번째 과정: [28, 125, 423, 505, 665, 836]
41번째 과정: [535, 764]
42번째 과정: [151, 535, 764]
43번째 과정: [468, 547]
44번째 과정: [42, 171]
45번째 과정: [42, 171, 468, 547]
46번째 과정: [42, 151, 171, 468, 535, 547, 764]
47번째 과정: [28, 42, 125, 151, 171, 423, 468, 505, 535, 547, 665, 764, 836]
48번째 과정: [24, 28, 42, 72, 125, 151, 171, 346, 368, 373, 414, 423, 450, 468, 483, 505, 535, 547, 665, 731, 764, 800, 825, 836, 909]
49번째 과정: [0, 24, 28, 42, 72, 89, 124, 125, 151, 171, 195, 236, 274, 287, 322, 325, 346, 368, 373, 406, 414, 422, 423, 450, 462, 468, 475, 483, 505, 535, 547, 558, 589, 665, 668, 731, 738, 753, 764, 768, 788, 799, 800, 825, 833, 836, 886, 909, 928, 951]
----------------------------------------------------------------------
Ran 1 test in 0.001s
OK
Execution Image
