코딩테스트/백준

[백준][C++]1377번 버블 소트

윤깡패 2023. 10. 13. 18:47

문제

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

 

1377번: 버블 소트

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

www.acmicpc.net

 

 

풀이

1. sort() 함수로 배열 정렬 ⇒ 시간 복잡도 O(nlogn)

 

2. 데이터의 정렬 전 index정렬 후 index를 비교해 왼쪽으로 가장 많이 이동한 값을 찾는다.

  ⇒ 정렬 전 index - 정렬 후 index의 최댓값 + 1

  * 1 : swap이 일어나지 않는 반복문이 한 번 더 실행되는 것을 감안

 

정렬(Sort) 알고리즘

 

정렬(Sort) 알고리즘

정렬(Sort) 알고리즘 데이터를 정해진 기준에 따라 순서대로 나열해 의미 있는 구조로 재설정하는 것 버블(Bubble) 정렬 알고리즘 데이터의 인접 요소끼리 비교하고, swap 연산을 수행하며 정렬하는

soobin0821.tistory.com

 

 

코드

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int main()
{
  ios::sync_with_stdio(false);
  cin.tie(NULL);
  cout.tie(NULL);

  int N;	// 데이터 개수
  cin >> N;

  vector<pair<int, int>> A(N);	// 데이터 저장 배열
  // 배열 A 저장
  for(int i = 0; i < N; i++)
  {
    cin >> A[i].first;
    A[i].second = i;
  }

  sort(A.begin(), A.end());	// 배열 A 정렬 시간 복잡도 : O(nlogn)

  int max = 0;
  for(int i = 0; i < N; i++)
  {
    // 정렬 전 index - 정렬 후 index를 계산한 값 중 최댓값을 찾아 저장
    if(A[i].second - i > max)
    {
      max = A[i].second - i;
    }
  }

  cout << max + 1;	// 최댓값 + 1을 정답으로 출력

  return 0;
}

 

 

오답

안 쪽 for 문은 1 ~ (n - j)까지, 즉 왼쪽에서 오른쪽으로 이동하면서 swap 수행

  ⇒ 데이터의 정렬 전 index정렬 후 index를 비교해 왼쪽으로 가장 많이 이동한 값을 찾는다.

 

더보기
#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

int main()
{
  ios::sync_with_stdio(false);
  cin.tie(NULL);
  cout.tie(NULL);

  int N;
  cin >> N;
  vector<pair<int, int>> A(N);

  for(int i = 0; i < N; i++)
  {
    cin >> A[i].first;
    A[i].second = i;
  }

  sort(A.begin(), A.end());  // 배열 A 정렬 시간 복잡도 : O(nlogn)
  int Max = 0;

  for(int i = 0; i < N; i++)
  {
    // 정렬 전 index - 정렬 후 index를 계산한 값 중 최댓값을 찾아 저장
    if(Max < A[i].second - i)
    {
      Max = A[i].second - i;
    }
  }

  cout << Max + 1 << endl;
}

 

 

 

 

 

728x90

'코딩테스트 > 백준' 카테고리의 다른 글

[백준][C++]1722번 순열의 순서  (0) 2023.10.12
[백준][C++]1328번 고층 빌딩  (0) 2023.10.12
[백준][C++]13251번 조약돌 꺼내기  (0) 2023.10.10
[백준][C++]1256번 사전  (2) 2023.10.06
[백준][C++]1948번 임계경로  (0) 2023.09.22