백준 10812 C++ rotate함수

GGAE99·2023년 5월 1일
0

알고리즘

목록 보기
1/2

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함수에서 시작, 중간 값은 값을 포함하지만 마지막 값은 값을 포함하지 않기 때문이다.
중간값~마지막값을 앞으로 시작값~중간값을 뒤로 보내주는 알고리즘이다.

알고리즘 열심히 해야겠다ㅠㅠ

0개의 댓글