백준 문제풀이 1158번 요세푸스 문제(C++)

2024. 4. 30. 15:22백준문제풀이

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

 

 

큐를 사용해서 푼 문제

 

#include<iostream>
#include<queue>

using namespace std;

int main() {
	int k, n;
	queue<int> q1, q2;
	cin >> n >> k;
	for (int i = 1; i <= n; i++) {
		q1.push(i);
	}

	while (true)
	{
		if (q1.empty()) {
			break;
		}
		int temp;
		for (int i = 0; i < k - 1; i++) {
			temp = q1.front();
			q1.pop();
			q1.push(temp);
		}
		q2.push(q1.front());
		q1.pop();
	}
	cout << "<";
	for (int i = 0; i < n; i++) {
		if (i == n - 1) {
			cout << q2.front() << ">";
		}
		else {
			cout << q2.front()<<", ";
			q2.pop();
		}
	}
}

 

 

연결리스트를 사용해서 푼 문제

#include<iostream>
#include<list>

using namespace std;

int main() {
	int k, n;
	list<int> circlelist;
	cin >> n >> k;
	for (int i = 1; i <= n; i++) {
		circlelist.push_back(i);
	}
	list<int> ::iterator target = circlelist.begin();


	cout << "<";
	while (n>0)
	{
		for (int i = 1; i < k; i++) {
			target++;
			if (target == circlelist.end())target = circlelist.begin();
		}
		if (n == 1) {
			cout << *target;
			break;
		}
		cout << *target << ", ";
		n--;
		target = circlelist.erase(target);
		if (target == circlelist.end())target = circlelist.begin();
	}
	cout << ">";
	
}