문제 설명

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

 

1158번: 요세푸스 문제

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

www.acmicpc.net

1번부터 n번까지 n명의 사람이 원을 이루며 앉아있을 때, 순서대로 k번째 사람을 제거

원에서 사람들이 제거 되는 순서를 요세푸스 순열이라고 하는데, 이 순열을 구하기

 

제 풀이법

queue를 쓰면 금방 풀린다

 

우선 1번부터 n번까지의 사람을 queue에 넣어놓고, queue가 empty가 되지 않을때까지 while문을 반복한다

while문에서는 k번째의 사람을 구하기 위해서, k -1 번째의 사람은 pop한 뒤, 다시 뒤에 push 한다

k번째 사람은 pop을 한 후, 출력하며, 다시 뒤에 push 하지 않는다

 

계속 반복하여 n명의 사람이 최종적으로 pop이 되면 종료한다 

 

소스 코드

#include <iostream>
#include <queue>

using namespace std;

int main()
{
    int n, k;
    cin >> n >> k;
    
    queue<int> q;
    
    for (int i = 0; i < n; i++)
        q.push(i + 1);
    
    printf("<");
    while (!q.empty())
    {
        for (int i = 0; i < k - 1; i++)
        {
            q.push(q.front());
            q.pop();
        }
        printf("%d", q.front());
        q.pop();
        if (!q.empty())
        {
            printf(", ");
        }
    }
    printf(">");
    
    return 0;
}

'Algorithm Study' 카테고리의 다른 글

[프로그래머스] 1단계 - 소수 찾기  (0) 2023.01.11
[프로그래머스] 1단계 - 폰켓몬  (0) 2023.01.10
[백준] 5397 키로거  (0) 2023.01.10
[백준] 1406 에디터  (0) 2023.01.10
[백준] 1919 애너그램 만들기  (0) 2023.01.09
복사했습니다!