알고리즘/백준

0201. [BOJ#23968]알고리즘 수업 - 버블 정렬 1

Jinoo.keem 2024. 2. 1. 23:47
728x90

제출이력

python으로 오류나던 코드 pypy로 해결

내 코드

import sys

N, K = map(int, input().split())
# N개의 서로 다른 양의 정수, K번 교환
a = list(map(int, input().split())) # 배열 A

cnt = 0
result = -1
for i in range(N-1, 0, -1):
    for j in range(i):
        if a[j] > a[j+1]:
            a[j], a[j+1] = a[j+1], a[j]
            cnt += 1
            if cnt == K:
                result = f'{a[j]} {a[j+1]}'
print(result)

 

이번주에 배운 버블정렬 알고리즘을 참고했다.

python으로 제출하면 오류가나기 때문에 pypy로 제출하여 해결했다.

python 으로 제출했을 때 오류가 나는 이유로는

버블정렬 자체의 시간복잡도가 최선, 최악, 평균 모두 O(n^2)로 굉장히 비효율적이라 그렇다.

버블정렬의 구현은 간단하지만 배열의 크기가 커질수록 교환연산이 많이 일어나게 되어 생기는 이슈였다.

나중에 같은 오류를 마주했을 때 참고하면 좋을 것 같다.

 

스크랩 자료들

# 출처 : 위키백과
def bubbleSort(x):
	length = len(x)-1
	for i in range(length):
		for j in range(length-i):
			if x[j] > x[j+1]:
				x[j], x[j+1] = x[j+1], x[j]
	return x

출처 : https://gyoogle.dev/blog/algorithm/Bubble%20Sort.html

 


문제

오늘도 서준이는 버블 정렬 수업 조교를 하고 있다. 아빠가 수업한 내용을 학생들이 잘 이해했는지 문제를 통해서 확인해보자.

N개의 서로 다른 양의 정수가 저장된 배열 A가 있다. 버블 정렬로 배열 A를 오름차순 정렬할 경우 K 번째 교환되는 수를 구해서 우리 서준이를 도와주자.

크기가 N인 배열에 대한 버블 정렬 의사 코드는 다음과 같다.

bubble_sort(A[1..N]) { # A[1..N]을 오름차순 정렬한다.
    for last <- N downto 2
        for i <- 1 to last - 1
            if (A[i] > A[i + 1]) then A[i] <-> A[i + 1]  # 원소 교환
}

입력

첫째 줄에 배열 A의 크기 N(5 ≤ N ≤ 10,000), 교환 횟수 K(1 ≤ K ≤ N2)가 주어진다.

다음 줄에 서로 다른 배열 A의 원소 A1, A2, ..., AN이 주어진다. (1 ≤ Ai ≤ 109)

출력

K 번째 교환되는 두 개의 수를 작은 수부터 한 줄에 출력한다. 교환 횟수가 K 보다 작으면 -1을 출력한다.

예제 입력 1 복사

6 10
4 6 5 1 3 2

예제 출력 1 복사

2 4

4 6 5 1 3 2 -> 4 5 6 1 3 2 -> 4 5 1 6 3 2 -> 4 5 1 3 6 2 -> 4 5 1 3 2 6 -> 4 1 5 3 2 6 -> 4 1 3 5 2 6 -> 4 1 3 2 5 6 -> 1 4 3 2 5 6 -> 1 3 4 2 5 6 -> 1 3 2 4 5 6 -> 1 2 3 4 5 6. 총 11회 교환이 발생하고 열 번째 교환은 2와 4이다.

예제 입력 2 복사

6 12
4 6 5 1 3 2

예제 출력 2 복사

-1

교환 횟수 11이 K 보다 작으므로 -1을 출력한다.

 

'알고리즘 > 백준' 카테고리의 다른 글

0206. [BOJ#14425] 문자열 집합  (1) 2024.02.06
0205. [BOJ#28445] 알록달록 앵무새  (1) 2024.02.05
0205. [BOJ#2167] 2차원 배열의 합  (1) 2024.02.05
0203. [BOJ#10815] 숫자카드  (1) 2024.02.03
0202. [BOJ#1181]단어정렬  (0) 2024.02.03