원소의 추가/제거 O(1)

제일 앞/뒤 원소 확인이 O(1)

나머지 원소들의 확인/변경이 원칙적으로 불가능 하지만 c++ STL deque에서는 인덱스로 원소에 접근할 수 있음

 

양쪽 끝에서 삽입과 삭제가 모두 가능하다.

Double ended Queue라는 뜻을 가지고 있음.

양방향 큐라는 느낌보다는 vector랑 비슷한데, front에도 O(1)에 추가/제거가 가능한 느낌임

deque은 모든 원소들이 메모리 상에 연속하게 배치되어 있지 않다.

 

연습 문제

 

1021: 회전하는 큐

더보기
#include <iostream>
#include <deque>
#include <algorithm>

using namespace std;

int main(void)
{
	ios_base::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr);

	int n, m;
	int answer = 0;

	deque<int> rq;
	deque<int> nums;

	cin >> n >> m;

	for (int i = 0; i < m; ++i)
	{
		int data;
		cin >> data;
		nums.push_back(data);
	}

	for (int i = 1; i <= n; ++i)
	{
		rq.push_back(i);
	}

	for (int num : nums)
	{
		// algorithm 헤더에 포함. 값을 찾으면 해당 위치의 iterator를 반환. 못찾으면 end.
		// 여기에 begin을 빼면 인덱스를 알 수 있음.
		int idx = find(rq.begin(), rq.end(), num) - rq.begin();
		while (num != rq.front())
		{
			// 왼쪽으로 밀기
			if (idx < (int)rq.size() - idx)
			{
				rq.push_back(rq.front());
				rq.pop_front();
			}
			else
			{
				rq.push_front(rq.back());
				rq.pop_back();
			}
			answer++;
		}
		rq.pop_front();
	}

	cout << answer;

	return 0;
}

 

접근은 괜찮게 했는데 나는 인덱스를 왼쪽으로 밀면 +1, 오른쪽으로 밀면 -1인 누적값을 하나 사용해서 덱사

이즈/2에 더해줘서 구해줬더니 정답이 아니길래 해답을 봤음.

코드 딱 두줄 추가하고 정답처리 받긴 했는데 좀 아쉽다.

 

 

'알고리즘 > 바킹독의 실전 알고리즘' 카테고리의 다른 글

[0x09] BFS  (0) 2022.07.28
[0x08] 스택의 활용  (0) 2022.07.25
[0x06] 큐  (0) 2022.07.25
[0x05] 스택  (0) 2022.07.25
[0x04] 연결 리스트  (0) 2022.07.25

+ Recent posts