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


[알고리즘풀이]

왼쪽, 오른쪽으로 회전하는 것을 덱을 이용해 양쪽에서 삽입, 삭제를 진행하면 된다.

덱에 1 ~ n 까지 삽입하고, 원하는 값이 몇 번째에 있는지 구한다.

그러면, 현재 front에서 왼쪽 / 오른쪽 중 어디로 순회하는 것이 적게 이동하는지 판단할 수 있고,

이동하며 횟수를 계속 Count 해주면 된다.

#include<iostream>
#include<deque>
#include<algorithm>

using namespace std;

int m_l[50];

int main(void) {
	ios::sync_with_stdio(false);
	cin.tie(0);

	deque<int> dq;
	int n, m, answer = 0;

	cin >> n >> m;
	for (int i = 1; i <= n; i++)
		dq.push_back(i);
	for (int i = 0; i < m; i++)
		cin >> m_l[i];

	for (int i = 0; i < m; i++) {
		if (dq.front() == m_l[i]){
			dq.pop_front();
			continue;
		}
		int inx = 0;
		for (int j = 0; j < dq.size(); j++)
			if (dq[j] == m_l[i])
				break;
			else
				inx = j;
		int r = 0, l = 0;
		// 오른쪽으로간다.
		if (inx < (dq.size() / 2)) {
			while (dq.front() != m_l[i]) {
				int temp = dq.front();
				dq.pop_front();
				dq.push_back(temp);
				r++;
			}
			dq.pop_front();
			answer += r;
		}
		// 왼쪽으로간다.
		else {
			while (dq.front() != m_l[i]) {
				int temp = dq.back();
				dq.pop_back();
				dq.push_front(temp);
				l++;
			}
			dq.pop_front();
			answer += l;
		}
	}
	cout << answer;
}

 

'Problem Solving > BOJ' 카테고리의 다른 글

[BOJ] 10828 - 스택  (0) 2019.09.19
[BOJ] 5430 - Integer Lists  (0) 2019.09.18
[BOJ] 10866 - 덱  (0) 2019.09.17
[BOJ] 1966 - Printer Queue  (0) 2019.09.17
[BOJ] 11866 - 조세퍼스 문제 0  (0) 2019.09.17

+ Recent posts