본문 바로가기
알고리즘

BOJ 11866 조세퍼스 문제0

by LaTale 2018. 10. 4.

조세퍼스 문제는 다음과 같다.


1번부터 N번까지 N명의 사람이 원을 이루면서 앉아있고, 양의 정수 M(≤ N)이 주어진다. 이제 순서대로 M번째 사람을 제거한다. 한 사람이 제거되면 남은 사람들로 이루어진 원을 따라 이 과정을 계속해 나간다. 이 과정은 N명의 사람이 모두 제거될 때까지 계속된다. 원에서 사람들이 제거되는 순서를 (N, M)-조세퍼스 순열이라고 한다. 예를 들어 (7, 3)-조세퍼스 순열은 <3, 6, 2, 7, 5, 1, 4>이다.


N과 M이 주어지면 (N,M)-조세퍼스 순열을 구하는 프로그램을 작성하시오.





circular queue를 이용했다.


1~N까지 큐에 입력 후 M만큼 뒤로 보내고, 하나 출력시마다 front +1 하는 식으로 front를 조정했다.


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
// 11866 조세퍼스 문제0
#include<stdio.h>
#define FOR(i,j) for(int i=1;i<=j;i++)
#define MAX 1001
int main() {
	int N, M;
	int queue[MAX] = { 0, };
	int adj[MAX] = { 0, };
	int front, back;

	FOR(i, MAX-1) {
		queue[i] = i;
	}

	scanf("%d %d", &N, &M);
	front = 1, back = N;
	FOR(i, N) {
		FOR(j, M-1) {
			back %= N;
			back++;
			queue[back] = queue[front];
			front %= N;
			front++;
		}
		adj[i] = queue[front];
		front %= N;
		front++;
	}
	printf("<");
	FOR(i, N - 1)
		printf("%d, ", adj[i]);
	printf("%d>", adj[N]);
}


1158 조세퍼스 문제는 위 문제와 똑같으므로 생략하겠다. MAX의 범위만 고쳐주면 된다.



'알고리즘' 카테고리의 다른 글

BOJ 2747 피보나치 수  (1) 2018.10.04
BOJ 10866 덱  (0) 2018.10.04
BOJ 1966 프린터 큐  (0) 2018.10.04
BOJ 1260 DFS와 BFS  (0) 2018.10.04
BOJ 10845 큐  (0) 2018.10.04