/* 회전하는 큐라. 한번 문제를 읽어보고 풀어보도록 하겠습니다. 복습의 개념이 아니라, 한번 풀어보도록 하겠습니다. 현재시간 5시 13분입니다. 3가지 연산이 가능합니다. 첫번째 원소를 뽑아내는 것, 왼쪽으로 한 칸 이동하는 것 팝프론트해서 백하면 되겠습니다. 오른쪽에 한 칸 이동하는 것은, 팝 백 해서 프론트하면 되겠습니다. 포함되어 있는 수 ㅔㄴ이 주어지고 뽑아내려고 하는 원소의 위치가 주어집니다. 처음 큐에서의 위치입니따. 2번 3번 연산의 최솟값을 출력하는 프로그램을 작성하세요 주어진 순서대로 뽑아내는데 드는 2번 3번 연산의 최솟값을 출력하는 프로그램. */ #include <iostream> #include <deque> using namespace std; int n, r; deque<int> deq; deque<int>::iterator iter; int main() { cin >> n >> r; for (int i = 1; i <= n; i++) deq.push_back(i); int cnt = 0; for (int i = 0; i < r; i++) { int now; cin >> now; int size = deq.size(); int index = 1; for (iter = deq.begin(); iter < deq.end(); iter++) { if (*iter == now) break; index++; } int left = index - 1; int right = size - index + 1; if (left < right) { for (int i = 1; i <= left; i++) { deq.push_back(deq.at(0)); deq.pop_front(); cnt++; } deq.pop_front(); } else { for (int i = 1; i <= right; i++) { deq.push_front(deq.at(size - 1)); deq.pop_back(); cnt++; } deq.pop_front(); } } cout << cnt << endl; return 0; } |
큐가 없더라도 배열을 앞뒤로 이동하면서 head, tail 하면서 충분히 찾을 수 있으리라 생각됩니다. 그러나, 지금은 익숙하지 않기 때문에 오케이. 일단 이렇게 처리하도로고 하겠습니다. 이렇게 문제에 대해서 익수가게 만들은 다음에, 천천히 구현하도록 합니다. |