문제
오늘도 서준이는 버블 정렬 수업 조교를 하고 있다. 아빠가 수업한 내용을 학생들이 잘 이해했는지 문제를 통해서 확인해보자.
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을 출력한다.
풀이
정렬 방법 중 하나인 버블 정렬에 대해서 알 수 있는 문제이다.
버블 정렬은 서로 이웃한 원소의 값을 비교하여, 두 원소의 대소에 따라 두 원소의 순서를 서로 바꿔가며 정렬하는 방식이다.
배열 크기가 N일 때, 시간 복잡도는 N * N으로 시간적으로 비효율적이지만 안정적이라는 특징이 있다. 정렬 종류에 대해 추가적인 부분은 추후 포스팅하는걸로..
어쨋든 버블 정렬의 아이디어 자체는 단순하게 이웃한 원소끼리 값을 비교하여 원소의 위치를 교환하는 것으로 가장 간단하게 구현할 수 있는 정렬 방법 중 하나이다.
두 원소가 교환되는 횟수를 count하여 그 횟수가 k와 같을 때, 교환하는 두 원소를 출력하면 된다. 정렬이 끝까지 완료되었는데 count가 k보다 작은 경우는 교환 횟수가 k보다 작은 경우이므로, 이 경우에는 -1을 출력하게 한다.
코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
|
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
public class Main {
public static int k;
public static int cnt;
public static void main(String[] args) throws IOException {
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(bf.readLine());
int size = Integer.parseInt(st.nextToken());
k = Integer.parseInt(st.nextToken());
st = new StringTokenizer(bf.readLine());
int[] arr = new int [size];
for (int i=0; i<size; i++) {
arr[i] = Integer.parseInt(st.nextToken());
}
bubble_sort(arr);
if (cnt < k) {
System.out.println(-1);
}
}
public static void bubble_sort (int[] arr) {
cnt = 0;
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr.length - 1; j++) {
int tmp1 = arr[j];
int tmp2 = arr[j+1];
if (tmp1 > tmp2) {
cnt++;
if (cnt == k) {
System.out.print(tmp2 + " " + tmp1);
return;
}
arr[j+1] = tmp1;
arr[j] = tmp2;
}
}
}
}
}
|
cs |
'PS > Solve' 카테고리의 다른 글
[Java] Boj 23881: 알고리즘 수업 - 선택 정렬 1 (0) | 2025.03.10 |
---|---|
[Java] Boj 23969: 알고리즘 수업 - 버블 정렬 2 (1) | 2025.03.10 |
[Java] Boj 13417: 카드 문자열 (0) | 2025.02.22 |
[Java] Boj 1895: 필터 (0) | 2025.02.22 |
[Java] Boj 11899: 괄호 끼워넣기 (0) | 2025.02.22 |