본문으로 바로가기

백준 01021 - 회전하는 큐

category BOJ 백준/기타 2020. 11. 5. 17:43

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

 

1021번: 회전하는 큐

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

www.acmicpc.net

 

고려사항

- 개념은 덱이지만, 큐를 사용하는 것이 간단하다.

- m번 째 수라고 명시하지만, 사실상 1 ~ n 의 수이다. 즉, 특정 수를 뽑았다 해서 몇 번째 수인지 다시 계산 안해도 됨.

- 덱으로 구현해서 앞으로 옮길지, 뒤로 옮기지를 계산하려면 앞 서 뽑아 사라진 수들도 고려해야 하기 때문이다.

- 일반 큐를 사용하여 front == target 이 될 때까지 ++num, push, pop 연산 진행.

- 뽑을 수를 찾았다면, pop을 해주고 num 과 qSize - num  중 작은 값을 구한다.

- num 이 작다면 앞으로 수를 옮기는 게 최소, qSize - num 이 작다면 뒤로 수를 옮기는 게 최소이다.

 

#include <iostream>
#include <queue>
#include <algorithm>
using namespace std;

int main() {
    queue<int> q;
    int n, m, target, qSize, num, ans = 0;
    cin>>n>>m;
    for(int i=1;i<=n;++i){
        q.push(i);
    }
    for(int i=0;i<m;++i){
        cin>>target;

        qSize = q.size();
        num = 0;
        while(q.front() != target){
            q.push(q.front());
            q.pop();
            ++num;
        }

        q.pop();
        ans += min(num, qSize-num);
    }

    cout<<ans;
    return 0;
}

'BOJ 백준 > 기타' 카테고리의 다른 글

백준 01717 - 집합의 표현  (0) 2020.11.09
백준 05430 - AC  (0) 2020.11.05
백준 01966 - 프린터 큐  (0) 2020.11.03
백준 11866 - 요세푸스 문제 0  (0) 2020.11.01
백준 18258 - 큐 2  (0) 2020.10.31