Programing/백준, 프로그래머스(C++)

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

hye3193 2025. 1. 8. 14:43

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

제출 코드

#include <iostream>
#include <vector>
using namespace std;

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

    int n, k, idx = 0;
    cin >> n >> k;
    vector<int> v;
    for (int i = 1; i <= n; i++)
        v.push_back(i);
    
    cout << "<";
    while(n--)
    {
        idx += (k - 1);
        if (idx >= v.size()) idx = idx % v.size();
        cout << v[idx];
        if (n != 0) cout << ", ";
        v.erase(v.begin() + idx);
    }
    cout << ">";
}

circular queue를 사용해도 되겠으나 방법이 떠오르질 않아 vector로 구현하였다

#include <iostream>
#include <queue>
using namespace std;

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

    int n, k, idx = 0;
    cin >> n >> k;
    queue<int> q;
    for (int i = 1; i <= n; i++)
        q.push(i);
    
    cout << "<";
    while(n--)
    {
        idx += (k - 1);
        if (idx >= q.size()) idx = idx % q.size();
        for (int i = 1; i < k; i++)
        {
            q.push(q.front());
            q.pop();
        }
        cout << q.front();
        if (n != 0) cout << ", ";
        q.pop();
    }
    cout << ">";
}

추가로 다른 코드를 보다가 queue를 사용해 뒤로 보내기를 반복하는 방법이 있다는 것을 보고 작성한 코드이다.

queue를 이용해서 k번만큼 앞에 있던 사람을 뒤로 보내길 반복하며 타겟인 사람을 하나씩 출력하는 방식이다