본문 바로가기
Algorithm/Baekjoon

Baekjoon 23969 알고리즘 수업 - 버블 정렬 2 JAVA

by Hunveloper 2023. 4. 21.
728x90

 

23969번: 알고리즘 수업 - 버블 정렬 2

첫째 줄에 배열 A의 크기 N(5 ≤ N ≤ 10,000), 교환 횟수 K(1 ≤ K ≤ N2)가 주어진다. 다음 줄에 서로 다른 배열 A의 원소 A1, A2, ..., AN이 주어진다. (1 ≤ Ai ≤ 109)

www.acmicpc.net

문제

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

N개의 서로 다른 양의 정수가 저장된 배열 A가 있다. 버블 정렬로 배열 A를 오름차순 정렬할 경우 K 번 교환이 발생한 직후의 배열 A를 출력해 보자.

크기가 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 번 교환이 발생한 직후의 배열 A를 한 줄에 출력한다. 교환 횟수가 K 보다 작으면 -1을 출력한다

풀이

주어진 버블 정렬 의사코드를 이용하여 버블 정렬을 구현 후 원소를 교환하는 위치에 카운팅 변수를 추가한다.

카운팅 변수가 K번 교환이 생긴다면 반복을 종료하고 직후의 배열 A를 출력한다.

코드
import java.io.*;
import java.util.*;

public class Main {
	public static void main(String[] args) throws Exception{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine());
		StringBuilder sb = new StringBuilder();
		int n = Integer.parseInt(st.nextToken()), k=Integer.parseInt(st.nextToken()), cnt=0;
		int [] a = new int [n];
		st = new StringTokenizer(br.readLine());
		for(int i=0;i<n;i++)
			a[i]=Integer.parseInt(st.nextToken());
		for(int i=n-1;i>0;i--) {
			for(int j=0;j<=i-1 && cnt<k;j++) {
				if(a[j]>a[j+1]) {
					int temp=a[j];
					a[j]=a[j+1];
					a[j+1]=temp;
					cnt++;			# 카운팅 변수
				}
			}
		}
		if(cnt<k)
			sb.append("-1");
		else
			for(int i=0;i<n;i++)
				sb.append(a[i]+" ");
		System.out.println(sb.toString());
	}
}

 

728x90
728x90

'Algorithm > Baekjoon' 카테고리의 다른 글

Baekjoon 5532 방학 숙제 JAVA  (0) 2023.04.21
Baekjoon 2948 2009년 JAVA  (0) 2023.04.21
Baekjoon 1269 대칭 차집합 JAVA  (0) 2023.04.21
Baekjoon 1769 3의 배수 JAVA  (1) 2023.04.21
Baekjoon 10699 오늘 날짜 JAVA  (0) 2023.03.27

댓글