본문 바로가기
백준 코딩테스트/실버

1021) 회전하는 큐 (C++)

by xortl98 2022. 5. 9.
728x90

 출처 

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

 

1021번: 회전하는 큐

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

www.acmicpc.net

 내 풀이 

#include<iostream>
#include<deque>

using namespace std;

deque<int> dq;
int N = 0, M = 0;
int find_num;	//찾아내려고 하는 숫자 
int result = 0;

bool find_position(int position);

int main()
{
	cin >> N >> M;

	for (int i = 1; i <= N; i++)
	{
		dq.push_back(i);
	}

	for (int i = 0; i < M; i++)
	{
		cin >> find_num;
		//true면 옵션2 false면 옵션3 
		bool what_position = find_position(find_num);

		if (dq[0] == find_num) dq.pop_front();

		//옵션2
		else if (what_position)
		{
			while (1)
			{
				int pop_num = dq.front();
				if (dq[0] == find_num)
				{
					dq.pop_front();
					break;
				}
				else
				{
					dq.pop_front();
					dq.push_back(pop_num);
				}
				result++;
			}
		}
		//옵션3 
		else if (!what_position)
		{
			while (1)
			{
				int pop_num = dq.back();
				if (dq[0] == find_num)
				{
					dq.pop_front();
					break;
				}
				else
				{
					dq.pop_back();
					dq.push_front(pop_num);
				}
				result++;
			}
		}
	}
	cout << result;
}

//true면 옵션2가 발동 false면 옵션3이 발동 
bool find_position(int position)
{
	for (int i = 0; i < dq.size(); i++)
	{
		if (dq[i] == position)
		{
			if (i * 2 <= dq.size()) return true;
			else return false;
		}
	}
}

 해설

찾아야 할 숫자가 왼쪽 한 칸 이동할지(옵션2) 오른쪽으로 한 칸 이동할지(옵션3)를 find_position 함수 이용해서 true면 옵션2 false면 옵션3로 적용한 뒤 덱의 특성을 이용해서 옵션2이면 찾는 숫자가 나올 때까지 앞의 숫자를 빼서 뒤로 넣어주고 옵션3이면 찾는 숫자가 나올 때까지 뒤의 숫자를 빼서 앞으로 넣어주었다.

 

 느낀점 

나는 너무 멍청하다.

'백준 코딩테스트 > 실버' 카테고리의 다른 글

14425) 문자열 집합 (C++)  (0) 2022.05.11
4949) 균형잡힌 세상 (C++)  (0) 2022.05.10
11650) 좌표 정렬하기 (C++)  (0) 2022.05.09
1427) 소트인사이드 (C++)  (0) 2022.05.08
9012) 괄호 (C++)  (0) 2022.05.08