요세푸스 문제는 다음과 같다.
번 사람 오른쪽에는 번 사람이 앉아 있고, 번 사람 오른쪽에는 번 사람이 앉아 있고,
계속하여 같은 방식으로 명의 사람들이 원을 이루며 앉아 있다.
번 사람 오른쪽에는 번 사람이 앉아 있다.
이제 ()번 사람을 우선 제거하고, 이후 직전 제거된 사람의 오른쪽의 번째 사람을 계속 제거해 나간다.
모든 사람이 제거되었을 때, 제거된 사람의 순서는 어떻게 될까?
이 문제의 답을 (, )–요세푸스 순열이라고 하며, (, )–요세푸스 순열은 가 된다.
하지만 한 방향으로만 계속 돌아가는 건 너무 지루하다. 따라서 요세푸스 문제에 재미를 더하기 위해
명의 사람이 제거될 때마다 원을 돌리는 방향을 계속해서 바꾸려고 한다. 이렇게 정의된 새로운 문제의 답을 (, , )–반전 요세푸스 순열이라고 하며, (, , )–반전 요세푸스 순열은 가 된다.
, , 이 주어질 때, (, , )–반전 요세푸스 순열을 계산해 보자.
첫째 줄에 정수 , , 이 주어진다.
(, , )–반전 요세푸스 순열을 이루는 수들을 한 줄에 하나씩 순서대로 출력한다.
7 3 4
3
6
2
7
1
5
4
deque을 사용하지 않은 풀이
n, k, m = map(int, input().split())
q = [i for i in range(1, n + 1)]
idx = 0
cnt = 0
flag = False # False면,-> | True면, <-
while len(q) > 0:
if cnt % m == 0:
flag = not flag
if flag:
idx = (idx + k - 1) % len(q)
else:
idx = (idx - k) % len(q)
while idx < 0:
idx += len(q)
cnt += 1
print(q[idx])
q.pop(idx)
힌트를 참고한 deque를 이용한 풀이
from collections import deque
n, k, m = map(int, input().split())
q = deque(range(1, n + 1))
idx = 0
while q:
if idx // m % 2 == 0:
for _ in range(k - 1):
q.append(q.popleft())
else:
for _ in range(k):
q.appendleft(q.pop())
idx += 1
print(q.popleft())