본문 바로가기

CodingTEST

[백준 1377] 버블 소트 (JAVA)

반응형

백준 1377번 문제  - 버블 소트

 

1377번: 버블 소트

첫째 줄에 N이 주어진다. N은 500,000보다 작거나 같은 자연수이다. 둘째 줄부터 N개의 줄에 A[1]부터 A[N]까지 하나씩 주어진다. A에 들어있는 수는 1,000,000보다 작거나 같은 자연수 또는 0이다.

www.acmicpc.net


문제 분석

 

  • 정렬이 완벽하게 되어 더이상 스왑 동작이 일어나지 않았을 때, 버블 정렬한 횟 수

 

예시 ) 입력 : 다음 표 → 출력 : 3

 

버블 정렬 실행 횟 수 버블 정렬된 리스트 [10, 1, 5, 2, 3]
1 10, 1, 5, 2, 3 1, 5, 2, 3, 10
2 1, 5, 2, 3, 10 → 1, 2, 3, 5, 10
3 1, 2, 3, 5, 10 (더이상 정렬할 필요 없음)

 


해결 키 포인트
  • 정렬이 되었을 때, 버블 정렬 횟수를 알아내는 방법 고안 
    • 문제에 첨부된대로 이중 for문을 사용  시간 초과 발생
    • 정렬된 리스트와 정렬 전 리스트 비교 ( 어떻게? )
  • 버블 정렬이 1번 될 때, 일어나는 변화
    • 버블 정렬을 1번 할 때, 하나의 숫자가 리스트의 오른쪽으로 움직이는건 여러번 되지만 왼쪽으로 움직이는 건 1번만 가능
      ex) 10, 1, 5, 2, 3 → 1, 5, 2, 310 
  • 정렬된 리스트와 정렬 전 리스트를 비교하여 정렬 후 각 숫자들이 왼쪽으로 움직인 수의 최댓 값을 구한다
    → 이 값이 바로 정렬이 될 때까지의 버블 정렬 횟 수

 

비교를 통한 정렬 최대 횟수 구하기 예시


버블 정렬 설명

 

버블정렬은 두 인접한 데이터의 크기를 비교해 정렬하는 방법으로 반복문을 돌면서 인접한 데이터 간의 swap 연산으로 정렬한다.

→ 시간복잡도: O(n^2) : 다른 정렬 알고리즘보다 속도가 느린편

Do It! 알고리즘 코딩 테스트 기본


코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;

public class Main {
    public static void main(String[] args) throws IOException {

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int N = Integer.parseInt(br.readLine());

        BubbleSort [] A = new BubbleSort[N];
        for(int i=0;i<N;i++){
            // index와 값을 함께 저장
            A[i] = new BubbleSort(Integer.parseInt(br.readLine()), i);
        }

        // 정렬
        Arrays.sort(A);

        // 정렬되기까지 버블 정렬 횟수
        int maxValue = 0;
        for(int i=0; i<N; i++) {
            int preIndex = A[i].index;
            if (preIndex - i > maxValue) {
                maxValue = preIndex - i;
            }
        }

        System.out.println(maxValue + 1);
    }
}

// 값과 인덱스를 모두 담을 수 있는 클래스 (sort할때 비교가 가능하게 Comparable 인터페이스 구현)
class BubbleSort implements Comparable<BubbleSort> {
    int value;
    int index;

    BubbleSort(int value, int index) {
        this.value = value;
        this.index = index;
    }

    // 비교를 해주는 함수 (value의 값이 크면 배열 끝으로)
    @Override
    public int compareTo(BubbleSort b) {
        return this.value - b.value;
    }
}

 

반응형

'CodingTEST' 카테고리의 다른 글

[백준 11399] ATM (JAVA)  (0) 2023.07.29
[백준 1427] 소트인사이드 (JAVA)  (0) 2023.07.29
[백준 2750번] 수 정렬하기 (JAVA)  (0) 2023.03.12
[백준 11286번] 절댓값 힙 (JAVA)  (0) 2023.03.12
[백준 2164번] 카드2 (JAVA)  (0) 2023.03.12