본문 바로가기

백준/실버

[백준 1158번] 요세푸스 문제 (C++)

문제링크 : https://www.acmicpc.net/problem/1158

 

1158번: 요세푸스 문제

첫째 줄에 N과 K가 빈 칸을 사이에 두고 순서대로 주어진다. (1 ≤ K ≤ N ≤ 5,000)

www.acmicpc.net

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
const int MAX = 987654321;

int main()
{
    ios_base::sync_with_stdio(0); 
	cin.tie(0);
    
    int N, K;
    cin >> N >> K;

    queue<int>q;

    for(int i=1; i<=N; i++)
    {
        q.push(i); //큐에 값 넣기
    }
    cout << "<";

    while(!q.empty())
    {
        for(int i=1; i<K; i++) //K번 앞에값을 뒤로
        {
            q.push(q.front());
            q.pop();
        }
        if(q.size()==1) cout << q.front(); //마지막 1개는  ", " 출력 필요없음
        else cout << q.front() << ", "; //K번째 값 출력하고 삭제
        q.pop();
    }
    cout << ">";

    return 0;
}

큐를 활용한 문제다.

K번째 전까지는 값을 맨 뒤에 다시 넣고, K번째에는 출력하고 해당 값을 삭제하는 것을 반복한다.

여기서 마지막 값은 뒤에 ", "을 출력해줄 필요가 없기에 이를 주의해야 한다.