코딩테스트/백준
[백준] 1377번: 버블 소트
쪼르뚜
2024. 9. 7. 16:34
728x90
반응형
🔗 문제 링크
https://www.acmicpc.net/problem/1377
반응형
728x90
👩💻 코드
#include <iostream>
#include <algorithm>
#include <vector>
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());
int max = 0;
for(int i=0; i<N; i++){
if(max < A[i].second - i){
max = A[i].second - i;
}
}
cout << max+1;
return 0;
}
📝 풀이
Do it! 알고리즘 코딩테스 - C++ 편 : 기출 유형 분석부터 문제 풀이 비법까지!를 참고하였습니다.
버블 정렬의 swap이 한 번도 일어나지 않은 루프가 언제인지 알아내는 문제입니다.
버블 정렬의 swqp이 한 번도 일어나지 않았다는 것은 이미 모든 데이터가 정렬됐다는 것을 의미합니다.
하지만 버블 정렬로 문제를 풀면 시간 초과가 일어날 수 있기 때문에 다른 아이디어가 필요합니다.
버블 정렬의 안 쪽 루프는 1에서 N-i까지 왼쪽에서 오른쪽으로 이동하며 swap을 수행합니다.
이는 특정 데이터가 안쪽 루프에서 swqp의 왼쪽으로 이동할 수 있는 최대 거리가 1이라는 뜻입니다.
즉, 데이터의 정렬 전 index와 정렬 후 index를 비교해 왼쪽으로 가장 많이 이동한 값을 찾으면 됩니다.
정렬 전 데이터를 (값, 인덱스)로 A에 저장합니다.
sort 함수를 통해 정렬을 수행한 후 정렬 전 index와 정렬 후 index 차를 구합니다.
이 중 가장 큰 값을 찾고 swap이 일어나지 않는 반복문이 한 번 더 실행되는 것을 감안해 1을 더하여 출력합니다.
728x90
반응형