[Java] Boj 23968: 알고리즘 수업 - 버블 정렬 1

2025. 3. 4. 18:59·PS/Solve

문제

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

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;
                }
            }
        }
    }
}
Colored by Color Scripter
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
'PS/Solve' 카테고리의 다른 글
  • [Java] Boj 23881: 알고리즘 수업 - 선택 정렬 1
  • [Java] Boj 23969: 알고리즘 수업 - 버블 정렬 2
  • [Java] Boj 13417: 카드 문자열
  • [Java] Boj 1895: 필터
hyeon0117
hyeon0117
컴공으로 살아남기
  • hyeon0117
    컴공 생활기
    hyeon0117
  • 전체
    오늘
    어제
    • 분류 전체보기 (55) N
      • Algorithm (2)
      • PS (17) N
        • Solve (17) N
      • CS (36)
        • 객체지향설계 & 패턴 (12)
        • COLMAP (2)
        • 머신러닝 (1)
        • 프로그래밍 언어론 (19)
        • 형식언어 (1)
        • 운영체제 (1)
  • 블로그 메뉴

    • 홈
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    java
    다이나믹 프로그래밍
    백준13417
    PLT
    알고리즘
    객체지향설계
    객체지향
    PS
    soild 패턴
    BOJ
    함수
    블록 구조 언어
    프로그래밍 언어론
    언어 타입
    의미론
    형식언어론
    자료형
    최단 경로
    디자인패턴
    디자인 패턴
    백준 6825
    선택 정렬
    어휘 분석기
    백준23882
    백준
    자료구조
    형식언어
    플로이드 - 워셜
    백준 25418
    객체지향언어
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
hyeon0117
[Java] Boj 23968: 알고리즘 수업 - 버블 정렬 1
상단으로

티스토리툴바