본문 바로가기
알고리즘, 자료구조/알고리즘

[Deque] 1021 회전하는 큐

by Wordbe 2019. 8. 27.
728x90

 

문제에 나온 그대로 하면 풀리는 문제이다.

 

M <= N <= 50 이기 때문에,

최대 O(MN) 시간이 걸리므로 매우 넉넉하게 풀 수 있는 편이다.

 

#include <cstdio>
#include <deque>

using namespace std;
deque<int> deq;
int ans;

void move_left(){
    deq.emplace_back(deq.front());
    deq.pop_front();
}

void move_right(){
    deq.emplace_front(deq.back());
    deq.pop_back();
}

void printDeque(){
    // for (int i=0; i<deq.size(); ++i){
    //     printf("%d ", deq[i]);
    // }
    // printf("\n");
    for (auto it = deq.begin(); it != deq.end(); ++it){
        printf("%d ", *it);
    }
    printf("\n");
}

int main() {
    int n, m, k;
    scanf("%d %d", &n, &m);

    for (int i=1; i<=n; ++i){
        deq.emplace_back(i);
    }

    for (int i=0; i<m; ++i){
        scanf("%d", &k);
        // O(N)
        int cnt = 0;
        for (; cnt < n; ++cnt){
            if (deq[cnt] == k) break;
        }

        if (cnt <= n / 2){
            for (int i=0; i<cnt; ++i) move_left();
            ans += cnt;
        }
        else {
            for (int i=0; i<n - cnt; ++i) move_right();
            ans += n - cnt;
        }
        deq.pop_front();
        n--;
    }
    printf("%d\n", ans);
    return 0;
}
728x90

댓글