문제 출처
1. 문제설명
- 1번부터 N번까지 N명의 사람이 원을 이루면서 앉아있다.
- 양의 정수 K가 주어지는데, K번째 사람을 제거한다.
- 제거된 순서(요세푸스 순열)를 구하라
2. 알고리즘 설계
- 자료구조
queue
를 이용해서 N까지 숫자를 push
한다.
- K번째가 아닐 때까지 큐에
push & pop
해주고,
- 이후에
front
값을 정답 배열에 넣는다.
3. 로직
- 큐의 size가 K보다 적을 수 있기 때문에
- 나머지 연산(
%
)을 사용하였다.
4. 전체 코드
#include <bits/stdc++.h>
using namespace std;
bool visited[5001] = { false, };
int main(void)
{
ios::sync_with_stdio(false);
cin.tie(NULL);
queue<int> q;
int N, div; cin >> N >> div;
for (int i = 1; i <= N; i++)
q.push(i);
int idx = 1;
vector<int> ans;
while (!q.empty()) {
while (idx % div != 0) {
q.push(q.front());
q.pop();
idx++;
}
idx = 1;
ans.push_back(q.front());
q.pop();
}
cout << '<';
for (int i = 0; i < ans.size() - 1; i++)
cout << ans[i] << ", ";
cout << ans[ans.size() - 1] << '>';
return 0;
}