버블 소트

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

 

1377번: 버블 소트

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

www.acmicpc.net

 

이 문제는 최종적으로 정렬이 되었을 때 몇 번째에서 정렬이 완료되었는지를 출력하는 것이 관건이다.

오름차순 정렬에서 버블소트는 가장 큰 수가 오른쪽으로 진행하게 된다.
이때, 한 번의 기회로 더 이상 횟수는 변하지 않는다.
하지만 작은 수는 왼쪽으로 이동을 수 없이 이동하게 될 것이다.
즉, 왼쪽으로 몇번 이동한지만 알 수 있다면 버블소트로 몇번만에 정렬이 되었는가를 알 수 있다.

 

이는 처음 입력되었을 때의 각 인덱스를 알고 있고, 이후 정렬된 인덱스의 차이를 보면 알 수 있다.
작은 값을 기준으로 생각했을 때 처음 입력되었던 위치에서 왼쪽으로 수 없이 이동 후 위치된 인덱스가 최종 위치이며, 정렬이 끝난 것이다.
만일 n번째에서 버블소트가 정렬이 되었다면 즉, 작은 값은 처음 입력된 위치보다 n-1번째 앞에 위치될 것이다.

 

  • 정답 코드

      #include<iostream>
      #include<algorithm>
      using namespace std;
      #define maxNum 500001
    
      int n;
      pair<int, int> a[maxNum];
    
      int main() {
          cin >> n;
          for (int i = 0; i < n; i++) {
              cin >> a[i].first;
              a[i].second = i;
          }
          sort(a, a + n);
    
          int answer = 0;
          for (int i = 0; i < n; i++) {
              answer = max(answer, a[i].second - i);
          }
          cout << answer+1;
    
          return 0;
      }

'ProblemSolving' 카테고리의 다른 글

[BOJ] 1417 국회의원 선거  (0) 2022.05.12
[BOJ] 1010_다리 놓기 재해결  (0) 2022.05.11
[BOJ] 1354_무한 수열 2  (0) 2021.03.13
[BOJ] 1644_소수의 연속합  (0) 2021.03.08
[BOJ] 1737_Pibonacci  (0) 2021.03.06
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기