[ ALGORITHM ]/[ 백 준 ]

[BAEKJOON] 1021번 : 회전하는 큐

HiStar__ 2020. 7. 30. 17:25

문 제

 

소 스  코 드

#include<iostream>
#include<deque>


std::deque<int> Rotation_Queue(std::deque<int>&, const int &, int& , const char&);

int main() {
	std::ios_base::sync_with_stdio(false);
	std::cout.tie(NULL);
	std::cin.tie(NULL);
	
	std::deque<int> dq;
	int N, M, number;

	std::cin >> N >> M;

	int move_l{ 0 }, move_r{ 0 }, move{ 0 };

	for (int i = 1; i <= N; ++i) dq.push_back(i);
	for (int i = 0; i < M; ++i) {
		std::cin >> number;
		
		move_l = move_r = 0;

		auto dq_l{ Rotation_Queue(dq, number, move_l, 'l') };
		auto dq_r{ Rotation_Queue(dq, number, move_r, 'r') };

		if (move_l < move_r) {
			dq = dq_l;
			move += move_l;
		}
		else {
			dq = dq_r;
			move += move_r;
		}
	}

	std::cout << move;

	return 0;
}

std::deque<int> Rotation_Queue(std::deque<int>& dq, const int & num, int& m, const char& c) {
	
	std::deque<int> temp{ dq };

	while (num != temp.front()) {
		if ('r' == c) {
			int value{ temp.back() };
			temp.pop_back();
			temp.push_front(value);
			++m;
		}
		else if('l' == c) {
			int value{ temp.front() };
			temp.pop_front();
			temp.push_back(value);
			++m;
		}
		else exit(1);
	}

	temp.pop_front();

	return temp;
}

 

풀 이

 

  • Deque이기 때문에 오른쪽으로 회전, 왼쪽으로 회전을 직접 해야지 거리값을 구할 수 있다.
    N의 범위가 50 까지 있기 때문에 가능하다 생각하여 직접 회전을 하여 비교 하여 구현 하였다.

 

출 력 값

 

 

문 제  출 처

문제 링크 : [ BAEKJOON ] :  https://www.acmicpc.net/problem/1021

 

1021번: 회전하는 큐

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

www.acmicpc.net