알고리즘/백준

[백준/JAVA] 1377 버블소트

hxngpy 2025. 6. 10. 19:00

[문제]

https://www.acmicpc.net/problem/1377

 

[문제 풀이]

버블 소트는 인접한 원소끼리 한 번에 한 칸씩만 교환하면서 정렬을 진행한다. 
즉, 어떤 값이 제자리(정렬됐을 때의 인덱스)보다 뒤쪽(정렬되기 전의 인덱스가 큰 쪽)에 있다면, 한 패스당 한 칸씩 앞으로(인덱스가 작은 쪽으로) 이동하게 된다.

 

 

버블 소트 동작 복기

  • 한 패스가 끝나면 가장 큰(혹은 작은) 하나의 원소가 제자리로 간다.
  • 각 원소는 본래 위치에서 정렬된 위치까지 ‘인접 교환’으로만 이동하므로, 패스 수 = 그 요소가 이동해야 하는 칸 수

 

버블 소트는 정렬이 마무리 된 상태에서 정렬이 마무리가 됐는지 확인을 한 번하고 정렬이 됐으면 정렬을 마치므로, 
이 문제는 버블 정렬이 몇 번 일어나는지를 묻는 문제이기 때문에 마지막에 +1을 더해줘야 한다.

[정답 코드]

package bubleSort;

import java.util.*;
import java.io.*;

public class Boj_1377 {

	public static void main(String[] args) throws IOException{
		// TODO Auto-generated method stub
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		int n = Integer.parseInt(br.readLine());
		
		Num[] arr = new Num[n];
		for(int i=0; i<n; i++) {
			arr[i] = new Num(i, Integer.parseInt(br.readLine()));
		}

		Arrays.sort(arr, (x,y) -> x.value - y.value);
		
		int answer = 0;
		
		for(int i=0; i<n; i++) {
			int diff = arr[i].idx - i;
			answer = Math.max(diff, answer);
		}
		
		System.out.println(answer+1);
	}
	
	static class Num{
		int idx;
		int value;
		
		Num(int idx, int value){
			this.idx = idx;
			this.value = value;
		}
	}

}