문제 풀이/알고스팟

알고스팟 - 조세푸스 문제 (JOSEPHUS) [C++]

JJJaewon 2023. 12. 9. 15:01
반응형

 동적 배열이나 리스트를 사용하는 문제지만, Queue로도 가능할 것 같아서 풀었다. N <= 1000 이고 K <= 1000 이므로 최악으로 잡아도 최대 연산이 1,000,000 밖에 안된다. 따라서 테스트 케이스 50번을 돌려도 1초 내에 돌아간다.

 

#include <iostream>
#include <vector>
#include <queue>
#include <algorithm>

using namespace std;

queue<int> makeQueue(int N) {
	queue<int> q;

	for (int i = 1; i <= N; i++) {
		q.push(i);
	}

	return q;
}

vector<int> solve(int N, int K) {
	queue<int> q = makeQueue(N);

	while (q.size() > 2) {
		q.pop();	// kill

		for (int i = 0; i < K - 1; i++) {
			int front = q.front();
			q.pop();
			q.push(front);
		}
	}

	vector<int> answer;

	while (!q.empty()) {
		answer.push_back(q.front());
		q.pop();
	}

	sort(answer.begin(), answer.end());

	return answer;
}

int main() {
	ios_base::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);

	int C;
	cin >> C;

	for (int test = 0; test < C; test++) {
		int N, K;

		cin >> N >> K;

		vector<int> answer = solve(N, K);

		cout << answer[0] << " " << answer[1] << '\n';
	}

	return 0;
}
반응형