파이썬 버블 정렬: 초보자를 위한 친절한 설명과 예제
파이썬 버블 정렬: 간단하고 직관적인 정렬 알고리즘 이해하기 파이썬에서 버블 정렬은 가장 기본적인 정렬 알고리즘 중 하나로, 인접한 두 요소를 비교하여 순서를 바꾸는 방식으로 데이터를… Read More »파이썬 버블 정렬: 초보자를 위한 친절한 설명과 예제
파이썬 정렬 파이썬 정렬: 데이터 정리의 마법
파이썬에서 정렬은 데이터를 특정 기준에 따라 순서대로 배열하는 중요한 작업입니다. 깔끔하게 정돈된 데이터는 분석, 시각화, 그리고 다른 작업을 훨씬 쉽게 만들어줍니다. 파이썬은 다양한 정렬 방법을 제공하며, 여러분의 필요에 따라 적합한 방법을 선택할 수 있습니다.
기본 정렬: `sorted()` 함수
파이썬에서 가장 기본적인 정렬 방법은 `sorted()` 함수를 사용하는 것입니다. `sorted()` 함수는 입력으로 받은 시퀀스를 정렬하여 새로운 리스트를 반환합니다.
“`python
numbers = [5, 2, 8, 1, 9]
sorted_numbers = sorted(numbers)
print(sorted_numbers) # 출력: [1, 2, 5, 8, 9]
“`
`sorted()` 함수는 기본적으로 오름차순으로 정렬합니다. 내림차순으로 정렬하려면 `reverse=True` 옵션을 추가하면 됩니다.
“`python
numbers = [5, 2, 8, 1, 9]
sorted_numbers = sorted(numbers, reverse=True)
print(sorted_numbers) # 출력: [9, 8, 5, 2, 1]
“`
리스트 내부 정렬: `sort()` 메서드
리스트 자체를 직접 정렬하고 싶다면 `sort()` 메서드를 사용할 수 있습니다. `sort()` 메서드는 리스트를 직접 수정하며, 새로운 리스트를 반환하지 않습니다.
“`python
numbers = [5, 2, 8, 1, 9]
numbers.sort()
print(numbers) # 출력: [1, 2, 5, 8, 9]
“`
`sort()` 메서드 역시 `reverse=True` 옵션을 사용하여 내림차순으로 정렬할 수 있습니다.
“`python
numbers = [5, 2, 8, 1, 9]
numbers.sort(reverse=True)
print(numbers) # 출력: [9, 8, 5, 2, 1]
“`
복잡한 데이터 정렬: `key` 매개변수
`sorted()` 함수와 `sort()` 메서드는 `key` 매개변수를 통해 정렬 기준을 지정할 수 있습니다. `key` 매개변수에는 정렬에 사용할 함수를 전달합니다.
예를 들어, 문자열 리스트를 길이 순으로 정렬하려면 다음과 같이 할 수 있습니다.
“`python
words = [“apple”, “banana”, “cherry”, “date”]
sorted_words = sorted(words, key=len)
print(sorted_words) # 출력: [‘date’, ‘apple’, ‘banana’, ‘cherry’]
“`
`key=len`은 각 문자열의 길이를 반환하는 함수이므로, `sorted()` 함수는 길이를 기준으로 문자열을 정렬합니다.
사전형 정렬: `items()` 메서드와 `sorted()` 함수
사전형 데이터는 `items()` 메서드를 통해 키-값 쌍으로 변환한 후 `sorted()` 함수를 사용하여 정렬할 수 있습니다.
“`python
student_scores = {“Alice”: 90, “Bob”: 85, “Charlie”: 95}
sorted_scores = sorted(student_scores.items(), key=lambda item: item[1])
print(sorted_scores) # 출력: [(‘Bob’, 85), (‘Alice’, 90), (‘Charlie’, 95)]
“`
`key=lambda item: item[1]`은 각 키-값 쌍의 값(점수)을 추출하는 익명 함수입니다. 따라서 `sorted()` 함수는 값을 기준으로 키-값 쌍을 정렬합니다.
다중 정렬: `key` 매개변수와 튜플
여러 기준으로 정렬해야 할 경우, `key` 매개변수에 튜플을 사용하여 다중 기준을 지정할 수 있습니다.
예를 들어, 학생들의 이름과 점수를 기준으로 정렬하려면 다음과 같이 할 수 있습니다.
“`python
students = [(“Alice”, 90), (“Bob”, 85), (“Charlie”, 95)]
sorted_students = sorted(students, key=lambda item: (item[1], item[0]))
print(sorted_students) # 출력: [(‘Bob’, 85), (‘Alice’, 90), (‘Charlie’, 95)]
“`
`key=lambda item: (item[1], item[0])`은 각 학생의 튜플에서 점수(item[1])를 첫 번째 기준, 이름(item[0])을 두 번째 기준으로 정렬하도록 지정합니다.
파이썬 정렬: 다양한 활용
파이썬의 정렬 기능은 데이터 분석, 검색 알고리즘, 그래픽 처리 등 다양한 분야에서 활용됩니다.
데이터 분석: 데이터를 특정 기준으로 정렬하여 분석 결과를 쉽게 파악할 수 있습니다.
검색 알고리즘: 정렬된 데이터는 이진 검색과 같은 효율적인 검색 알고리즘을 적용할 수 있게 해줍니다.
그래픽 처리: 그래픽 이미지를 정렬하여 이미지 분석이나 특정 영역 추출에 사용할 수 있습니다.
FAQs
Q: 파이썬 정렬은 어떤 방식으로 이루어지나요?
A: 파이썬은 기본적으로 병합 정렬 알고리즘을 사용하여 정렬을 수행합니다. 병합 정렬은 리스트를 반복적으로 분할하고 정렬하여 최종적으로 정렬된 리스트를 만드는 방식입니다.
Q: 정렬 시 시간 복잡도가 궁금합니다.
A: 파이썬의 `sorted()` 함수와 `sort()` 메서드는 대부분의 경우 O(n log n)의 시간 복잡도를 가지고 있습니다. 즉, 데이터 크기가 증가할수록 정렬 시간이 로그적으로 증가합니다.
Q: `key` 매개변수에 사용할 수 있는 함수는 어떤 종류가 있나요?
A: `key` 매개변수에는 정렬 기준을 정의하는 모든 함수를 사용할 수 있습니다. 예를 들어, 문자열을 정렬할 때는 문자열의 길이, 첫 번째 문자, 알파벳 순서 등을 기준으로 정렬하는 함수를 사용할 수 있습니다.
Q: 파이썬에서 정렬 시 주의해야 할 사항이 있나요?
A: 파이썬 정렬은 일반적으로 안전하고 효율적이지만, 다음과 같은 점을 주의해야 합니다.
* `key` 매개변수에 전달하는 함수는 모든 입력에 대해 일관된 결과를 반환해야 합니다.
* 정렬 시 메모리 사용량이 증가할 수 있으므로, 대량의 데이터를 정렬할 때는 메모리 관리에 유의해야 합니다.
정리
파이썬의 정렬 기능은 데이터를 효율적으로 관리하고 분석하는 데 필수적인 도구입니다. `sorted()` 함수와 `sort()` 메서드를 사용하여 다양한 정렬 기준을 적용하고, 데이터를 원하는 순서대로 배열할 수 있습니다. 정렬의 기본 원리와 다양한 활용 방법을 이해하면 파이썬 프로그래밍 역량을 한층 더 발전시킬 수 있습니다.
파이썬 버블정렬 최적화 파이썬 버블 정렬 최적화: 효율성을 높이는 방법
파이썬에서 버블 정렬은 가장 간단한 정렬 알고리즘 중 하나로 알려져 있어요. 하지만 효율성 면에서는 그렇게 좋지 않다는 단점이 있죠. 특히 데이터 규모가 커질수록 느려지는 문제가 있어요. 이 글에서는 파이썬 버블 정렬 알고리즘을 더 효율적으로 만들기 위한 몇 가지 최적화 방법을 알려드릴게요.
1. 조기 종료 (Early Termination)
버블 정렬은 인접한 요소들을 비교하면서 정렬하는데, 이미 정렬된 부분은 더 이상 비교할 필요가 없어요. 조기 종료는 정렬이 완료된 부분을 찾아내어 불필요한 비교를 줄이는 방법이에요.
“`python
def bubble_sort(arr):
n = len(arr)
swapped = True
for i in range(n – 1):
if swapped:
swapped = False
for j in range(n – i – 1):
if arr[j] > arr[j + 1]:
arr[j], arr[j + 1] = arr[j + 1], arr[j]
swapped = True
return arr
“`
이 코드는 swapped 변수를 사용하여 이전 패스에서 교환이 발생했는지 여부를 확인합니다. 교환이 발생하지 않았다면 이미 정렬된 것이므로 더 이상 반복할 필요가 없어요.
2. 최적화된 패스 (Optimized Pass)
버블 정렬은 각 패스마다 모든 요소들을 비교하지만, 가장 큰 요소는 첫 번째 패스에서 마지막 위치로 이동하게 됩니다. 따라서 다음 패스에서는 가장 큰 요소를 제외하고 비교하면 돼요.
“`python
def bubble_sort(arr):
n = len(arr)
for i in range(n – 1):
for j in range(n – i – 1):
if arr[j] > arr[j + 1]:
arr[j], arr[j + 1] = arr[j + 1], arr[j]
return arr
“`
이 코드에서는 패스 횟수를 n-1로 제한하여 최적화된 패스를 수행합니다.
3. 삽입 정렬과의 결합 (Combining with Insertion Sort)
삽입 정렬은 버블 정렬보다 더 효율적인 정렬 알고리즘 중 하나입니다. 특히 거의 정렬된 데이터에 대해서는 삽입 정렬이 더 빠르게 작동해요. 따라서 버블 정렬의 초기 단계에서 삽입 정렬을 적용하여 효율성을 높일 수 있습니다.
“`python
def bubble_sort(arr):
n = len(arr)
for i in range(n – 1):
for j in range(n – i – 1):
if arr[j] > arr[j + 1]:
arr[j], arr[j + 1] = arr[j + 1], arr[j]
# 삽입 정렬 적용
for i in range(1, n):
key = arr[i]
j = i – 1
while j >= 0 and key < arr[j]:
arr[j + 1] = arr[j]
j -= 1
arr[j + 1] = key
return arr
“`
이 코드는 버블 정렬 후 삽입 정렬을 적용하여 최적화된 정렬을 수행합니다.
4. 파이썬 내장 함수 활용 (Using Python's Built-in Function)
파이썬에는 이미 효율적인 정렬 알고리즘을 구현한 `sorted()` 함수가 존재합니다. 버블 정렬보다 훨씬 빠르고 안정적이기 때문에 실제 코드에서는 `sorted()` 함수를 사용하는 것이 좋습니다.
“`python
def bubble_sort(arr):
return sorted(arr)
“`
이 코드는 파이썬의 `sorted()` 함수를 사용하여 간단하게 배열을 정렬합니다.
파이썬 버블 정렬 최적화: 자주 묻는 질문 (FAQ)
Q: 버블 정렬은 실제 코드에서 사용하는 것이 좋지 않다고 하셨는데, 언제 사용하는 것이 좋을까요?
A: 버블 정렬은 간단하고 이해하기 쉬운 알고리즘이기 때문에 학습 목적으로 사용하는 것이 좋습니다. 실제 코드에서는 더 효율적인 알고리즘을 사용하는 것이 좋지만, 버블 정렬을 통해 정렬 알고리즘의 기본 개념을 이해하는 데 도움이 될 수 있습니다.
Q: 버블 정렬을 최적화하는 방법은 무엇이 있을까요?
A: 버블 정렬은 조기 종료, 최적화된 패스, 삽입 정렬과의 결합, 파이썬 내장 함수 활용 등 다양한 방법으로 최적화할 수 있습니다. 이러한 방법들은 버블 정렬의 효율성을 높이고 실행 시간을 단축하는 데 도움이 됩니다.
Q: 버블 정렬의 시간 복잡도는 얼마나 될까요?
A: 버블 정렬의 시간 복잡도는 최악의 경우 O(n²)입니다. 즉, 데이터 규모가 커질수록 실행 시간이 기하급수적으로 증가합니다. 최적화된 버블 정렬은 O(n)의 시간 복잡도를 가질 수 있지만, 여전히 다른 정렬 알고리즘보다 효율성이 떨어집니다.
Q: 버블 정렬은 어떤 분야에서 사용될까요?
A: 버블 정렬은 실제 코드에서는 잘 사용되지 않지만, 교육 목적으로 사용되거나 작은 규모의 데이터를 정렬하는 데 사용될 수 있습니다.
이 글이 파이썬 버블 정렬 최적화에 대한 이해를 돕기를 바랍니다. 앞으로도 더욱 효율적이고 강력한 코드를 작성하는 데 도움이 될 수 있도록 다양한 알고리즘과 최적화 기법을 탐구해 보세요. 파이썬 정렬 알고리즘 파이썬 정렬 알고리즘: 데이터를 정리하는 다양한 방법들
데이터 과학에서 데이터를 정렬하는 것은 필수적인 작업입니다. 정렬은 데이터를 특정 기준에 따라 순서대로 배열하는 과정으로, 데이터 분석, 검색, 그리고 효율적인 처리를 위해 매우 중요합니다. 파이썬은 다양한 정렬 알고리즘을 제공하여 개발자들이 자신에게 맞는 방법으로 데이터를 효율적으로 정렬할 수 있도록 지원합니다.
이 글에서는 파이썬에서 사용 가능한 정렬 알고리즘들을 자세히 살펴보고, 각 알고리즘의 특징과 장단점을 비교 분석하여 이해를 돕고자 합니다. 또한, 실제 코드 예제를 통해 각 알고리즘의 작동 원리를 직접 확인하고, 다양한 데이터셋에 어떻게 적용할 수 있는지 알아보겠습니다.
1. 버블 정렬 (Bubble Sort)
버블 정렬은 가장 기본적인 정렬 알고리즘 중 하나입니다. 이 알고리즘은 인접한 두 요소를 비교하여 순서가 바뀌어야 한다면 서로 자리를 바꾸는 방식으로 동작합니다. 이 과정을 리스트 전체를 탐색할 때까지 반복하면 가장 큰 요소가 리스트의 마지막 위치로 이동하게 됩니다. 이 과정을 리스트의 크기만큼 반복하면 리스트 전체가 정렬됩니다.
장점:
* 구현이 간단하고 이해하기 쉽습니다.
단점:
* 시간 복잡도가 높아 데이터의 크기가 커지면 성능이 크게 저하됩니다. 특히, 이미 정렬된 데이터셋이나 거의 정렬된 데이터셋의 경우에도 시간이 오래 걸리는 단점이 있습니다.
코드 예제:
“`python
def bubble_sort(arr):
n = len(arr)
for i in range(n):
for j in range(0, n – i – 1):
if arr[j] > arr[j + 1]:
arr[j], arr[j + 1] = arr[j + 1], arr[j]
return arr
data = [5, 1, 4, 2, 8]
sorted_data = bubble_sort(data)
print(sorted_data) # 출력: [1, 2, 4, 5, 8]
“`
2. 삽입 정렬 (Insertion Sort)
삽입 정렬은 정렬된 부분 리스트와 정렬되지 않은 부분 리스트를 나누어 정렬하는 알고리즘입니다. 정렬되지 않은 부분 리스트의 첫 번째 요소를 가져와 정렬된 부분 리스트에서 적절한 위치에 삽입하는 방식으로 동작합니다.
장점:
버블 정렬보다 빠르고, 거의 정렬된 데이터셋에서는 매우 효율적입니다.
* 인플레이스 정렬로 추가적인 메모리 공간을 필요로 하지 않습니다.
단점:
* 데이터의 크기가 커지면 시간 복잡도가 높아지므로 큰 데이터셋에 적합하지 않습니다.
코드 예제:
“`python
def insertion_sort(arr):
n = len(arr)
for i in range(1, n):
key = arr[i]
j = i – 1
while j >= 0 and key arr[j]:
min_idx = j
arr[i], arr[min_idx] = arr[min_idx], arr[i]
return arr
data = [5, 1, 4, 2, 8]
sorted_data = selection_sort(data)
print(sorted_data) # 출력: [1, 2, 4, 5, 8]
“`
4. 병합 정렬 (Merge Sort)
병합 정렬은 분할 정복 (Divide and Conquer) 전략을 사용하는 정렬 알고리즘입니다. 리스트를 절반으로 나누어 각 부분 리스트를 재귀적으로 정렬한 후, 정렬된 두 부분 리스트를 병합하여 하나의 정렬된 리스트를 만드는 방식으로 동작합니다.
장점:
* 시간 복잡도가 매우 낮아 큰 데이터셋을 효율적으로 정렬할 수 있습니다.
* 안정적인 정렬 알고리즘으로 동일한 값을 가진 요소의 상대적인 위치를 유지합니다.
단점:
* 추가적인 메모리 공간을 필요로 합니다.
코드 예제:
“`python
def merge_sort(arr):
if len(arr) > 1:
mid = len(arr) // 2
left_arr = arr[:mid]
right_arr = arr[mid:]
merge_sort(left_arr)
merge_sort(right_arr)
i = j = k = 0
while i < len(left_arr) and j < len(right_arr):
if left_arr[i] < right_arr[j]:
arr[k] = left_arr[i]
i += 1
else:
arr[k] = right_arr[j]
j += 1
k += 1
while i < len(left_arr):
arr[k] = left_arr[i]
i += 1
k += 1
while j < len(right_arr):
arr[k] = right_arr[j]
j += 1
k += 1
return arr
data = [5, 1, 4, 2, 8]
sorted_data = merge_sort(data)
print(sorted_data) # 출력: [1, 2, 4, 5, 8]
“`
5. 퀵 정렬 (Quick Sort)
퀵 정렬 역시 분할 정복 전략을 사용하는 정렬 알고리즘입니다. 리스트에서 피벗 (pivot) 요소를 선택하고, 피벗보다 작은 요소들은 피벗의 왼쪽, 피벗보다 큰 요소들은 피벗의 오른쪽으로 배치합니다. 그런 다음 왼쪽 부분 리스트와 오른쪽 부분 리스트를 재귀적으로 정렬합니다.
장점:
* 시간 복잡도가 낮아 큰 데이터셋을 효율적으로 정렬할 수 있습니다.
* 일반적으로 병합 정렬보다 빠르지만, 최악의 경우 시간 복잡도가 높아질 수 있습니다.
단점:
* 안정적인 정렬 알고리즘이 아닙니다.
코드 예제:
“`python
def quick_sort(arr, low, high):
if low < high:
pi = partition(arr, low, high)
quick_sort(arr, low, pi – 1)
quick_sort(arr, pi + 1, high)
return arr
def partition(arr, low, high):
pivot = arr[high]
i = low – 1
for j in range(low, high):
if arr[j] <= pivot:
i += 1
arr[i], arr[j] = arr[j], arr[i]
arr[i + 1], arr[high] = arr[high], arr[i + 1]
return i + 1
data = [5, 1, 4, 2, 8]
sorted_data = quick_sort(data, 0, len(data) – 1)
print(sorted_data) # 출력: [1, 2, 4, 5, 8]
“`
6. 힙 정렬 (Heap Sort)
힙 정렬은 이진 힙 (Binary Heap) 자료구조를 이용한 정렬 알고리즘입니다. 힙은 완전 이진 트리 형태로 구성되며, 부모 노드는 자식 노드보다 항상 크거나 작은 값을 갖습니다. 힙 정렬은 먼저 입력 데이터를 힙으로 만들고, 힙의 루트 노드 (가장 큰 값)를 리스트의 마지막 위치와 바꿉니다. 그런 다음 힙을 다시 구성하고 루트 노드를 리스트의 두 번째 마지막 위치와 바꾸는 방식으로 진행합니다. 이 과정을 반복하면 리스트 전체가 정렬됩니다.
장점:
* 시간 복잡도가 낮아 큰 데이터셋을 효율적으로 정렬할 수 있습니다.
* 인플레이스 정렬로 추가적인 메모리 공간을 필요로 하지 않습니다.
단점:
* 구현이 복잡합니다.
* 안정적인 정렬 알고리즘이 아닙니다.
코드 예제:
“`python
def heapify(arr, n, i):
largest = i
l = 2 * i + 1
r = 2 * i + 2
if l < n and arr[largest] < arr[l]:
largest = l
if r < n and arr[largest] 1:
arr = counting_sort_for_radix(arr, exp)
exp *= 10
return arr
def counting_sort_for_radix(arr, exp):
n = len(arr)
output = [0] * n
count = [0] * 10
for i in range(n):
index = (arr[i] // exp) % 10
count[index] += 1
for i in range(1, 10):
count[i] += count[i – 1]
for i in range(n – 1, -1, -1):
index = (arr[i] // exp) % 10
output[count[index] – 1] = arr[i]
count[index] -= 1
return output
data = [5, 1, 4, 2, 8]
sorted_data = radix_sort(data)
print(sorted_data) # 출력: [1, 2, 4, 5, 8]
“`
9. 파이썬 내장 정렬 함수: `sorted()`
파이썬은 `sorted()` 함수를 제공하여 리스트를 정렬할 수 있습니다. `sorted()` 함수는 기본적으로 오름차순으로 정렬하며, `reverse` 인수를 사용하여 내림차순으로 정렬할 수 있습니다. `key` 인수를 사용하여 정렬 기준을 지정할 수도 있습니다.
코드 예제:
“`python
data = [5, 1, 4, 2, 8]
sorted_data = sorted(data)
print(sorted_data) # 출력: [1, 2, 4, 5, 8]
sorted_data = sorted(data, reverse=True)
print(sorted_data) # 출력: [8, 5, 4, 2, 1]
data = [{‘name’: ‘Alice’, ‘age’: 25}, {‘name’: ‘Bob’, ‘age’: 30}, {‘name’: ‘Charlie’, ‘age’: 20}]
sorted_data = sorted(data, key=lambda item: item[‘age’])
print(sorted_data) # 출력: [{‘name’: ‘Charlie’, ‘age’: 20}, {‘name’: ‘Alice’, ‘age’: 25}, {‘name’: ‘Bob’, ‘age’: 30}]
“`
정렬 알고리즘 선택 가이드
데이터의 크기: 큰 데이터셋의 경우 시간 복잡도가 낮은 병합 정렬, 퀵 정렬, 힙 정렬이 적합합니다.
데이터의 종류: 정수 데이터의 경우 계수 정렬, 기수 정렬이 효율적입니다.
안정성:병합 정렬은 안정적인 정렬 알고리즘으로 동일한 값을 가진 요소의 상대적인 위치를 유지합니다.
구현의 복잡성: 버블 정렬, 삽입 정렬, 선택 정렬은 구현이 간단하지만, 성능이 낮습니다.
FAQ
Q: 파이썬에서 어떤 정렬 알고리즘을 사용해야 할까요?
A: 데이터의 크기, 데이터의 종류, 성능, 안정성, 구현의 복잡성 등 여러 요소를 고려하여 선택해야 합니다. 일반적으로 병합 정렬, 퀵 정렬, 힙 정렬이 가장 많이 사용됩니다.
Q: 병합 정렬과 퀵 정렬 중 어떤 것이 더 좋을까요?
A: 병합 정렬은 안정적인 알고리즘으로, 최악의 경우에도 시간 복잡도가 보장됩니다. 퀵 정렬은 평균적으로 병합 정렬보다 빠르지만, 최악의 경우 시간 복잡도가 높아질 수 있습니다.
Q: 파이썬 내장 `sorted()` 함수는 어떤 정렬 알고리즘을 사용하나요?
A: 파이썬 내장 `sorted()` 함수는 `Timsort`라는 정렬 알고리즘을 사용합니다. `Timsort`는 병합 정렬과 삽입 정렬을 결합한 하이브리드 알고리즘으로, 실제로 매우 효율적입니다.
Q: 정렬 알고리즘의 시간 복잡도는 무엇을 의미하나요?
A: 시간 복잡도는 알고리즘의 실행 시간이 입력 데이터의 크기에 따라 어떻게 변하는지를 나타내는 척도입니다. 시간 복잡도가 낮을수록 입력 데이터가 커져도 실행 시간이 크게 증가하지 않습니다.
Q: 정렬 알고리즘의 공간 복잡도는 무엇을 의미하나요?
A: 공간 복잡도는 알고리즘이 실행되는 데 필요한 추가적인 메모리 공간을 나타내는 척도입니다. 공간 복잡도가 낮을수록 추가적인 메모리 공간을 적게 사용합니다.
파이썬 버블 정렬 관련 기사 모음입니다. 최신 정보는 여기에서 업데이트됩니다. trainghiemtienich.com. 자세히 보기: https://trainghiemtienich.com/category/religion blog
파이썬 버블 정렬: 간단하고 직관적인 정렬 알고리즘 이해하기 파이썬에서 버블 정렬은 가장 기본적인 정렬 알고리즘 중 하나로, 인접한 두 요소를 비교하여 순서를 바꾸는 방식으로 데이터를… Read More »파이썬 버블 정렬: 초보자를 위한 친절한 설명과 예제