blog

2023-10-21-동국대SW역량강화캠프-5. 조세퍼스 문제

Algorithm#Algorithm

문제

조세퍼스 문제는 여러 명의 사람들 중 최후의 1인을 고를 때 사용하는 방법이다.

먼저 모인 사람들끼리 특정한 숫자 M을 고른다. 그 다음 한 사람이 숫자 1을 부르고, 그 다음 그 옆에 있는 사람이 2를 부르고 이런 식으로 시계 방향으로 숫자를 하나 씩 불러나간다. 이때 숫자 M의 배수를 부른 사람은 원에서 빠져나간다.

이렇게 한 명씩 원에서 빠져나가 마지막 한 사람이 남을 때까지 이것을 반복한다.

예를 들어, 7명의 사람이 있고 M=3이고, 시계 방향대로 순서대로 1부터 7까지 번호를 붙였을 때 게임의 양상은 아래와 같다.

번호부른 숫자
11
22
33
44
55
66
77
18
29
410
511
712
113
414
515
116
417
118

이렇게 해서 순서대로 3, 6, 2, 7, 5, 1 번째 사람이 게임에서 나가고 4만 남게 된다.

이런 식 N명의 사람이서 M으로 게임을 진행했을 때 나가는 사람의 순서를 조세퍼스 순열이라고 부른다. 예를 들어 N=7, M=3인 경우 조세퍼스 순열은 3,6,2,7,5,1,4가 된다.

N과 M이 주어졌을 때 (N,M)-조세퍼스 순열을 구하는 프로그램을 작성하여라.

입력

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

출력

예제와 같이 조세퍼스 순열을 출력한다.

예제 1 입력

7 3

예제 1 출력

3 6 2 7 5 1 4

예제 2 입력

6 4

예제 2 출력

4 2 1 3 6 5

Source

from collections import deque

q = deque()
li = []

n, m = map(int, input().split())

for i in range(1, n + 1):
	q.append(i)

while(True):
	if(len(q) == 0):
		break
	for i in range(m - 1):
		x = q.popleft()
		q.append(x)
	x = q.popleft()
	li.append(x)

print(*li)