[백준] 11866번 요세푸스 문제 0 / C++

#문제

백준 11866번 요세푸스 문제 0

#풀이

#include <iostream>
#include <vector>

using namespace std;

vector<int> peoples;

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

	int N, K;
	cin >> N >> K;

	for (int i = 1; i <= N; ++i)
	{
		peoples.push_back(i);
	}

	int target = 0;

	cout << '<';
	while (!peoples.empty())
	{
		target += K - 1;
		target %= peoples.size();

		cout << peoples[target];
		peoples.erase(peoples.begin() + target);

		if (!peoples.empty())
		{
			cout << ", ";
		}
	}
	cout << '>';

	return 0;
}

#정리

주어진 N개의 원소를 K의 배수로 삭제한다. 7, 3이 주어졌다면 … 3, 6, 2(7>1>2), 7(4>5>7), 5, 1, 4 이런 식으로 넘어가면 1부터, 이미 삭제된 숫자라면 넘어간다. 주어진 N개만큼 vector의 원소를 초기화 후, vector가 empty가 아닌 동안 다음의 연산을 반복했다. target num에 K-1을 더해주고, vector의 크기로 나머지 연산을 하면서 출력. 출력된 숫자는 erase 메서드를 사용하여 지워줬다. **알고리즘 공부하면서 linked list로 해결한 경험이 생각났다. 그 때는 타겟 숫자를 삭제하면서, 앞 뒤 원소의 prev, next pointer를 변경해주며 해결했었다. 지금은 vector가 알아서 그 일을 해주니, 훨씬 편하게 문제를 해결할 수 있게 되었다.




    Enjoy Reading This Article?

    Here are some more articles you might like to read next:

  • [백준] 1934번 최소공배수 / C++
  • [백준] 1940번 주몽 / C++
  • [백준] 9613번 GCD 합 / C++
  • [백준] 2309번 일곱 난쟁이 / C++
  • [백준] 10773번 제로 / C++