Post

[백준] 1377번_버블 소트(Java)

문제 풀이

백준의 1377번 문제입니다. 문제 출처

(1) 문제 파악

p

버블 정렬 알고리즘을 통해 배열의 값을 정렬할 때 swap한 횟수를 구하는 문제입니다.

(2) 문제 풀이 방법 생각하기

문제에 주어진 코드를 그대로 사용해서 값을 구하면 N의 최대 값이 500_000이기 때문에 시간 초과가 나옵니다. (버블 정렬의 시간 복잡도는 O(n^2)입니다!)

p

한 번의 큰 루프가 수행될 때 특정 값이 이동할 수 있는 최대 거리는 1입니다. 즉, 데이터 정렬 전의 인덱스와 정렬 후 인덱스를 비교하여 가장 많이 왼쪽으로 이동한 값을 찾으면 문제를 해결할 수 있습니다.

여기서는 swap이 일어나지 않는 마지막 i까지 루프를 돌기 때문에 최대값 + 1이 정답입니다.

(3) 시간 복잡도 확인

시간 제한은 2초 입니다. 즉, 대략 2억번 연산 안에 문제를 해결해야 합니다.

Arrays.sort()의 시간 복잡도는 O(nlogn) 이며, 인덱스 차이 비교를 위한 루프는 N번 수행됩니다.

(4) 구현

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
import java.io.*;
import java.util.*;

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());
        Data[] arr = new Data[N];
        
        for(int i=0; i<N; i++) {
            arr[i] = new Data(Integer.parseInt(br.readLine()), i);
        }
        
        Arrays.sort(arr);

        int gap = Integer.MIN_VALUE;
        for(int i=0; i<N; i++) {
            int n = arr[i].idx - i;
            gap = Math.max(gap, n);
        }
        
        System.out.println(gap+1);
        br.close();
    }
    
    static class Data implements Comparable<Data> {
        int value;
        int idx;
        
        public Data(int value, int idx) {
            this.value = value;
            this.idx = idx;
        }
        
        @Override
        public int compareTo(Data d) {
            return this.value - d.value;
        }
    }
}

This post is licensed under CC BY 4.0 by the author.

Comments