BOJ

백준 1377 - 버블 소트

yanJuicy 2020. 3. 10. 21:36
반응형

문제

 

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

 

1377번: 버블 소트

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

www.acmicpc.net

 

 

풀이

 

버블 정렬의 과정이 총 몇 단계로 이루어지는지 구하는 문제이다. 버블 정렬이 진행되는 과정을 통해 문제를 해결할 수 있다.

문제에 10 1 5 2 3 이 주어졌는데

i = 1 일 때 버블 정렬의 진행 과정을 보면 1 10 5 2 3, 1 5 10 2 3, 1 5 2 10 3, 1 5 2 3 10 순서로 된다. 10이 맨 뒤로 가게 된다.

i = 2 일 때 진행 과정은 1 2 5 3 10, 1 2 3 5 10 순서로 되고 정렬이 끝나게 된다. 5가 맨 뒤로 가게 된다.

 

즉 앞에서 뒤로 제일 큰 숫자를 순서대로 보내고 있다. 이때 뒤에서 앞으로도 이동하는 숫자들이 있는데, i번째에서 이 숫자들은 앞으로 1칸만 이동하게 된다. 이 점을 이용해서 버블 정렬이 몇 단계로 진행되는지 알 수 있다. 

초기 배열인 10 1 5 2 3 과 정렬 후 배열인 1 2 3 5 10 에서 앞으로 이동하는 숫자들이 앞으로 몇 번 이동하는지 구하면 된다. 그 중에서 최대값이 버블 정렬의 총 단계가 된다.

 

 

코드

 

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
#include <iostream>
#include <algorithm>
 
using namespace std;
 
int n;
pair<int,int> a[500001];
 
int main()
{
    cin.tie(0);
    ios::sync_with_stdio(0);
 
    cin >> n;
    for (int i=1; i<=n; i++)
    {
        int num;
        cin >> num;
        a[i] = {num, i};
    }
 
    sort(a + 1, a + n + 1);
    
    int result = 0;
    for (int i=1; i<=n; i++)
    {
        if (a[i].second - i > result) result = a[i].second - i;
    }
 
    cout << result + 1;
 
    return 0;
}
 
cs

 

반응형

'BOJ' 카테고리의 다른 글

백준 1780 - 종이의 개수  (0) 2020.03.23
백준 1080 - 행렬  (0) 2020.03.22
백준 6064 - 카잉 달력  (0) 2020.03.09
백준 1783 - 병든 나이트  (0) 2020.03.06
백준 2225 - 합분해  (0) 2020.03.05