추천받아서 풀어본 그리디 문제.
https://www.acmicpc.net/problem/1377
1377번: 버블 소트
첫째 줄에 N이 주어진다. N은 500,000보다 작거나 같은 자연수이다. 둘째 줄부터 N개의 줄에 A[1]부터 A[N]까지 하나씩 주어진다. A에 들어있는 수는 1,000,000보다 작거나 같은 자연수 또는 0이다.
www.acmicpc.net
처음에는 lis인가 생각했었는데 일단 이건 아니었다.
만약 swap 연산 후에 break 했다면 lis였을지도?
어떠한 숫자가 뒤로 가는 연산은 j 루프 한번으로 충분하기때문에
교환한 원소의 갯수를 기준으로 생각하면 정답에 도달하기가 힘들다.
어떠한 숫자 K에 대해서 swap을 진행한다고 할때,
지문에 나온 코드를 통해서 정렬하면
K는 j에 대한 루프가 도는동안
앞으로는 한칸 이동할 수 있고
뒤로는 무제한하게 이동할 수 있다.
따라서 뒤로 이동하는 부분을 무시하고,
정렬한 배열과 정렬전의 배열에서 인덱스를 비교해서,
앞으로 이동한 칸수의 최댓값을 찾으면,
그 칸만큼 "앞으로" 이동하기 위해서 해당 횟수만큼의 j 루프가 돈것이기 때문에
문제에서 원하는 정답을 얻어낼 수 있다.
정답은 앞으로 이동한 칸수의 최댓값 + 1 ( i는 1부터 시작하기에 )
#include <bits/stdc++.h>
using namespace std;
vector <pair<int,int>> A;
vector <int> lis;
int main(){
int N,k;
cin >> N;
for(int i=0; i<N; i++){
cin >> k;
A.push_back({k,i});
}
int ans = -998244353;
sort(A.begin(), A.end());
for(int i=0; i<N; i++){
ans = max(ans, A[i].second-i);
}
cout << ans+1;
return 0;
}
반응형