rotate함수를 몰라서 혼자 해결하려 했을때는 배열을 사용하여 해결하려 했었다.
#include <iostream>
using namespace std;
int main(){
int N, M, i, j, k;
int arr[10];
cin >> N >> M;
for(int n=0; n<N; n++){
arr[n] = n+1;
cout << arr[n];
}
for(int m=0; m<M; m++){
cin >> i >> j >> k;
}
}
}
하지만 곧 어떻게 해야하는지 고민하면서 이를 해결해주는 함수가 있을거라는 생각을 했고, rotate라는 함수를 알 수 있었다.
rotate함수는 값을 회전시켜주는 함수이다. algorithm 라이브러리에 포함되어있다.
회전 시킬 때마다 원소들 간에 swap을 해주는 알고리즘이다.
컨테이너에 원소가 많이 존재하는 경우에 비효율적이다.
//벡터 v의 시작값 v.begin()
// 중간 값은 기준값 (어디서부터 기준을 잡을 것인지)
// 마지막 값은 회전시키는 값들의 끝
vector<int> v;
//v의 값이 (1,2,3,4,5)일때
rotate(v.begin(), v.begin() + 1, v.end());
//위 roatte의 실행 결과는 (2,3,4,5,1)
rotate(v.begin(), v.begin() + 3, v.end());
//위 rotate의 실행 결과는 v가(1,2,3,4,5) 일때 기준으로 (4,5,1,2,3)
그렇게 짠 코드가 아래의 코드이다.
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main(){
int N, M, i, j, k;
vector<int> v;
cin >> N >> M;
for(int n=1; n<=N; n++){
v.push_back(n);
}
while (M--){
cin >> i >> j >> k;
rotate(v.begin()+i-1, v.begin()+k-1, v.begin()+j);
}
for(int num:v){
cout<<num<<" ";
}
}
(i-1) 값을 v.begin()에 더해 시작 점을 정하고, [시작값]
(k-1) 값을 v.begin()에 더해 기준 점을 정하고, [중간값]
j 값을 v.begin()에 더해 회전할 값의 범위를 정한다. [마지막 값]
j값은 -1하지 않는 이유는 rotate함수에서 시작, 중간 값은 값을 포함하지만 마지막 값은 값을 포함하지 않기 때문이다.
중간값~마지막값을 앞으로 시작값~중간값을 뒤로 보내주는 알고리즘이다.
알고리즘 열심히 해야겠다ㅠㅠ