ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 회전하는 큐
    백준알고리즘 2019. 9. 21. 02:45

    https://www.acmicpc.net/problem/1021

     

    1021번: 회전하는 큐

    첫째 줄에 큐의 크기 N과 뽑아내려고 하는 수의 개수 M이 주어진다. N은 50보다 작거나 같은 자연수이고, M은 N보다 작거나 같은 자연수이다. 둘째 줄에는 지민이가 뽑아내려고 하는 수의 위치가 순서대로 주어진다. 위치는 1보다 크거나 같고, N보다 작거나 같은 자연수이다.

    www.acmicpc.net

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    #include <iostream>
    #include <vector>
    #include <deque>
     
    using namespace std;
     
    deque<int> q;
    int n, m;
    int ans =987654321;
    vector<int> ch;
     
    void go(deque<int>& q, int idx, int cnt){
        if(cnt > ans){
            return;
        }
        if(idx == m){
            if(ans > cnt) ans = cnt;
            return;
        }
        else{
            if(q.front() == ch[idx]){
                int x = q.front();
                q.pop_front();
                go(q, idx+1, cnt);
                q.push_front(x);
            }
            else{
                deque<int> q1 = q;
                vector<int> v;
                int id = 0;
                while(!q1.empty()){
                    if(ch[idx] == q1.front()) id = v.size();
                    v.push_back(q1.front());
                    q1.pop_front();
                }
                int x = q.front();
                if(id <= q.size()/2) {
                    q.pop_front();
                    q.push_back(x);
                    go(q, idx, cnt + 1);
                    q.pop_back();
                    q.push_front(x);
                }
                else {
                    x = q.back();
                    q.pop_back();
                    q.push_front(x);
                    go(q, idx, cnt + 1);
                    q.pop_front();
                    q.push_back(x);
                }
            }
        }
     
     
    }
     
    int main(){
        ios_base::sync_with_stdio(0);
        cin.tie(0);
     
        cin>>n>>m;
        for(int i = 1; i <= n; i++){
            q.push_back(i);
        }
        for(int i = 0; i < m; i++){
            int c;
            cin>>c;
            ch.push_back(c);
        }
        deque<int> q1 = q;
        go(q,0,0);
        cout<<ans<<'\n';
        return 0;
    }
    http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter
     

    시뮬레이션 이라기 보다는 브루트포스문제가 아닐까싶은문제였다.

    일단 백트래킹같은 방식으로는 진행시 걸러줄 조건을 찾기는 조금 까다로웠고

    queue 나 deque에 넣으면 안을볼수없다는 불편함때문에 그냥 벡터에 deque의 원소 복사한것들을

    하나하나 넣어가면서 위치파악하고 액션취해줄것을 선택해서 진행했다.

    '백준알고리즘' 카테고리의 다른 글

    성곽  (0) 2019.09.24
    거의 최단 거리  (0) 2019.09.24
    촌수계산  (0) 2019.09.21
    신기한 소수  (0) 2019.09.21
    사다리 조작  (0) 2019.09.21

    댓글

Designed by Tistory.