Algorithm/BAEKJOON

[Java] 1377 버블 소트

곽수진 2023. 4. 22. 02:44
반응형

문제

버블 소트 알고리즘을 다음과 같이 C++로 작성했다.

bool changed = false;
for (int i=1; i<=N+1; i++) {
    changed = false;
    for (int j=1; j<=N-i; j++) {
        if (A[j] > A[j+1]) {
            changed = true;
            swap(A[j], A[j+1]);
        }
    }
    if (changed == false) {
        cout << i << '\n';
        break;
    }
}

위 소스에서 N은 배열의 크기이고, A는 정렬해야 하는 배열이다. 배열은 A[1]부터 사용한다.

위와 같은 소스를 실행시켰을 때, 어떤 값이 출력되는지 구해보자.

 

입력

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

 

출력

정답을 출력한다.

 

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

public class Main{
    public static void main(String[] args) throws IOException{
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
        int num = Integer.parseInt(bufferedReader.readLine());
        mData[] arr = new mData[num];
        
        for(int i=0; i<num; i++){
            arr[i] = new mData(Integer.parseInt(bufferedReader.readLine()), i);
        }
        Arrays.sort(arr);
        
        int max = 0;
        for(int i=0; i<num; i++){
            if(max < arr[i].index - i)
                max = arr[i].index - i;
        }
        System.out.println(max+1);
    }
}

class mData implements Comparable<mData>{
    int value;
    int index;
    
    public mData(int value, int index){
        super();
        this.value = value;
        this.index = index;
    }
    
    @Override
    public int compareTo(mData o){
        return this.value - o.value;
    }
}

int num = Integer.parseInt(bufferedReader.readLine()) : 사용자로부터 데이터 개수를 입력받아 num 변수에 저장함

mData[] arr = new mData[num] : 입력받은 수를 담을 배열 arr를 num 크기만큼 선언함

for(int i=0; i<num; i++){ arr[i] = new mData(Integer.parseInt(bufferedReader.readLine()), i) } : arr 배열의 값을 사용자로부터 입력 받음

Arrays.sort(arr) : array 배열을 오름차순으로 정렬함

 

int max = 0;

for(int i=0; i<num; i++){
    if(max < arr[i].index - i)
        max = arr[i].index - i;
}
System.out.println(max+1);

▶ 정렬 전 index - 정렬 후 index를 계산해 최대값을 구한 후 swap이 일어나지 않는 반복문이 한 번 더 실행되는 것을 감안해 최댓값에 1을 더한 값을 결과로 출력함

 

class mData implements Comparable<mData>{
    int value;
    int index;
    
    public mData(int value, int index){
        super();
        this.value = value;
        this.index = index;
    }
    
    @Override
    public int compareTo(mData o){
        return this.value - o.value;
    }
}

▶ mData 클래스를 별도로 선언해줌

▶ 2차원 배열로 구현하면 Arrays.sort를 쓰지 못하게 되어 복잡해 지고 배열을 두 개 만들면 원래 인덱스의 값을 구별할 수 없어 Comparable 인터페이스를 구현

▶ mData 클래스는 부모 클래스로부터 상속받은 필드나 메소드를 자식 클래스에서 참조하는 데 사용하는 참조 변수 super()를 선언함

Comparable
▶ Comparable 인터페이스에는 compareTo(T o) 메소드 하나가 선언되어 있음
▶ Comparable을 사용하고자 한다면 compareTo 메소드를 재정의(Override) 해줘야 
반응형

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

[Java] 11399 ATM  (0) 2023.04.25
[Java] 1427 소트인사이드  (0) 2023.04.23
[Java] 2750 수 정렬하기  (0) 2023.04.21
[Java] 11286 절댓값 힙  (0) 2023.04.20
[Java] 2164 카드2  (0) 2023.04.19