[Python] 코딩 도장 - Bubble Sort
Updated:
코딩 도장 사이트의 문제를 직접 풀어본 내용을 정리하여 올립니다.
코딩 도장에서 여러 문제를 확인할 수 있습니다.
난이도 순으로 차근차근 풀어보려 합니다.
[문제: Bubble Sort] - Lv.2
배열을 소팅하는 것은 초보 프로그래머에게 유명한 문제이며 전문적인 프로그래밍에서도 매우 중요하게 다루어 진다.
소팅은 비교에 기반을 두어 배열을 재 정렬하는 방법이다. 다음의 배열을 생각해 보자.
a = [3, 1, 4, 1, 5, 9, 2, 6]
우리는 이 배열을 크기 순서대로 정렬하고 싶다. (좌측의 요소는 우측의 요소보다 작거나 같아야 한다.)
수학적으로 표현하자면 다음과 같다.
i < j, a[i] <= a[j]
인덱스 i가 j보다 작은 경우 배열의 값인 a[i]는 a[j]값보다 작거나 같아야 한다.
버블소트(Bubble Sort)는 이러한 소팅을 하기 위한 가장 간단한 방법 중 하나이다.
-
배열을 따라가며 인접한 쌍을 찾는다. (N개의 배열이 있을 경우 N-1개의 쌍이 존재하게 된다)
-
만약 a[i] <= a[i+1] 을 만족하지 않는 쌍을 찾게 되면 두 개의 값을 서로 바꾸어준다. (Swap)
-
더 이상 바꾸어야 할 쌍이 존재하지 않을 때까지 1번, 2번을 반복한다. (Loop)
i와 j라는 인덱스를 가진 두 개의 값을 서로 바꾸기(Swap) 위해서는 몇가지 방법이 있는데 임시 변수를 사용하는 예는 다음과 같다:
t = a[i]
a[i] = a[j]
a[j] = t
입력과 출력
입력 데이터의 첫번째 라인은 배열의 갯수를 의미하며 두번째 라인은 배열의 요소값을 의미한다.
출력 데이터는 두개의 값으로 이루어진다.
첫번째 값은 배열을 따라 진행(Loop)한 횟수이며 두번째 값은 Swap이 발생한 총 횟수이다.
다음은 입출력 예제이다:
input data:
8
3 1 4 1 5 9 2 6
answer:
5 8
출처: https://codingdojang.com/scode/448?answer_mode=hide
[풀이]
def BubbleSort(a):
loop = 0
swap = 0
while True:
b = a.copy()
for i in range(len(a)-1):
if a[i] > a[i+1]:
a[i], a[i+1] = a[i+1], a[i]
swap += 1
loop += 1
if b == a:
break
return print(loop, swap)
a = [3, 1, 4, 1, 5, 9, 2, 6]
BubbleSort(a)
5 8
이 문제는 다른 점보다 loop가 결국 최종 완성된 배열도 읽어야 배열이 정렬되었는지 확인 한다는 것이다.
def BubbleSort(a):
loop = 0
swap = 0
while True:
b = a.copy()
for i in range(len(a)-1):
if a[i] > a[i+1]:
a[i], a[i+1] = a[i+1], a[i]
swap += 1
loop += 1
print(b, a)
if b == a:
break
return print(loop, swap)
a = [3, 1, 4, 1, 5, 9, 2, 6]
BubbleSort(a)
[3, 1, 4, 1, 5, 9, 2, 6] [1, 3, 1, 4, 5, 2, 6, 9]
[1, 3, 1, 4, 5, 2, 6, 9] [1, 1, 3, 4, 2, 5, 6, 9]
[1, 1, 3, 4, 2, 5, 6, 9] [1, 1, 3, 2, 4, 5, 6, 9]
[1, 1, 3, 2, 4, 5, 6, 9] [1, 1, 2, 3, 4, 5, 6, 9]
[1, 1, 2, 3, 4, 5, 6, 9] [1, 1, 2, 3, 4, 5, 6, 9]
5 8
위와 같이 전 후 비교를 위해선 다 정렬이 되어도 한번 더 읽어야하므로 loop가 1 늘어난다.
[추천 풀이]
# bubble sort
def bubble_sort(a):
pass_count = 0
swap_count = 0
while True:
swap = 0
for i in range(len(a)-1):
if a[i] > a[i+1]:
a[i], a[i+1] = a[i+1], a[i]
swap+=1
pass_count += 1
if swap:
swap_count += swap
else:
break
return pass_count, swap_count, a
print (bubble_sort([3, 1, 4, 1, 5, 9, 2, 6]))
(5, 8, [1, 1, 2, 3, 4, 5, 6, 9])
stop 조건을 swap 수로 설정한 것 외에는 동일하다.
Leave a comment