📖 Problem


1158

🔓 Solve


가장 먼저 든 생각은, 큐에서 제거할 사람의 위치를 특정하고, 그만큼 pop을 수행하여 그 위치로 이동하고, 대상을 제거한 후에, pop을 한만큼 다시 push를 해주는 것이었다.

이 때 대상의 위치는 K % (큐의 size) 로 구할 수 있다.

그런데 문제에서 요구하는 것은 대상을 제거하고, 해당 위치에서 탐색을 재개하는 것이다.

따라서 큐에서 대상까지 가면서 pop과 동시에 push를 진행하였다. 이러면 자연스럽게 데이터들은 뒤로 순서가 밀리게 된다.

이를 큐가 빌 때까지 반복문으로 반복해주면 된다.

💻 Code


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#include <iostream>
#include <queue>
#include <vector>

using namespace std;

int main() {
	int N, K;
	cin >> N >> K;
	// input

	queue<int> que;
	vector<int> result;
	result.reserve(5000);
	// store result

	for (int count = 1; count <= N; count++) {
		// queue initialize
		que.push(count);
	}

	while (!que.empty()) {
		int pos = K % que.size();
		// if pos == 1, it indicates first data
		// if pos == 0, it indicates last data

		int count;
		if (pos == 0) {
			// exception case : last data
			count = que.size() - 1;
		}
		else {
			count = pos - 1;
		}
		
		for (int i = 0; i < count; i++) {
			// readjust position of data
			que.push(que.front());
			que.pop();
		}
		result.push_back(que.front());
		que.pop();
		
	}

	// print
	cout << "<";
	for (int index = 0; index < result.size() - 1; index++) {
		cout << result[index] << ", ";
	}
	cout << result[result.size() - 1] << ">" << endl;
}

큐에서 데이터를 pop하면서 동시에 push를 할 생각만 하면 구현은 어렵지 않은 문제이다.



⚡개인적으로 공부하면서 포스팅한 글입니다. 오류가 있는 경우 지적해주시면 감사하겠습니다!⚡

카테고리:

업데이트:

댓글남기기