반응형
https://algospot.com/judge/problem/read/JOSEPHUS
처음 입력 시 순서대로 넣어주기 때문에 sorting 할 필요가 없습니다. 그 다음 원소를 접근하는 개념으로써 자료구조 list가 적당합니다. vector로 사용하기엔 구현하기 어려운 문제였습니다. vector가 연속된 자료들의 집합이기 때문에 erase()함수를 쓰면 지운 다음 배열을 가르키기 때문에 만약 vector의 end()라면 반환값은 쓰레기 값이 들어가게 됩니다. 따라서 바로 다음 원소의 위치를 가르키고 있는 형태의 연결리스트 구조가 이 문제를 풀기 좋습니다.
#include <iostream>
#include <list>
#include <algorithm>
using namespace std;
int main() {
int c, n, k;
cin >> c;
while (c--)
{
cin >> n >> k;
list <int> p(n);
int cnt = 1;
for (auto it = p.begin(); it != p.end(); it++)
{
*it = cnt++;
}
int f = 0;
int die = 0;
list <int>::iterator pre = p.begin();
list <int>::iterator cmp;
while (p.size() != 2)
{
pre = p.erase(pre);
if (pre == p.end())pre = p.begin();
for (int i = 0; i < k - 1; i++) {
pre++;
if (pre == p.end())pre = p.begin();
}
}
for (auto it = p.begin(); it != p.end(); it++)
{
cout << *it << ' ';
}
cout << '\n';
}
}