백준 11866 C++

yun·2024년 1월 2일
0

C++

목록 보기
20/41
#include <iostream>
#include <queue>

using namespace std;

int n, k, tmp;

queue<int> q;

int main() {
	ios_base::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    
    cin >> n >> k;
    
    for(int i = 1; i <= n; i++){
        q.push(i);
    }
    
    cout << '<';
    
    while(q.size() > 1){
        for(int i=0;i<k-1;i++){
            tmp = q.front();
            q.push(tmp);
            q.pop();
        }
        
        tmp = q.front();
        cout << tmp << ", ";
        q.pop();
    }
    
    tmp = q.front();
    
    cout << tmp << ">\n";
    
	return 0;
}

처음에 주어진 숫자가 7 3이라면
원을 이루고 있는 사람은 1 2 3 4 5 6 7 형태이다.


1회차에는 3번이 제거된다.

1 2 X 4 5 6 7

2회차에는 4부터 시작해서 3번째인 6번이 제거된다.

1 2 X 4 5 X 7

3회차에는 7부터 시작해서 3번째인 2번이 제거된다.

1 X X 4 5 X 7

4회차에는 4부터 시작해서 3번째인 7번이 제거된다.

1 X X 4 5 X X

5회차에는 1부터 시작해서 3번째인 5번이 제거된다.

1 X X 4 X X X

6회차에는 1->4->1이므로, 1번이 제거된다.

X X X 4 X X X

7회차에는 남은 마지막 숫자인 4번이 제거된다.

따라서 이때 결과로 얻어진 요세푸스 순열은 <3, 6, 2, 7, 5, 1, 4>이다.

N개의 수가 있을 때 N회차까지 실행하는데, 마지막에는 하나만 남아있으므로 while문은 N-1회차까지 실행하면 된다. queue에 2개가 남아있을 때까지만 실행한다.

반복문 내에서는 현재 queue의 가장 앞에 있는 수를 queue의 뒤에 추가하고, 추가한 수는 제거하는 방식으로 K번째 수를 찾는다.

0개의 댓글

관련 채용 정보