https://www.acmicpc.net/problem/1158
요세푸스 문제 - n, k를 입력받아 1부터 n까지 n개의 숫자를 원형 리스트로 두고 (k - 1)개를 건너뛰고 k번의 요소를 제거한다. 이후 그 과정을 반복하여 제거한다.
💡 n = 7, k = 3 일 때, 숫자 리스트 1 2 3 4 5 6 7에서
1 2 4 5 6 7 | 3 → 1,2를 건너뛰고 3 제거 (target index = 2)
1 2 4 5 7 | 3 6 → 4,5를 건너뛰고 6 제거 (target index = 4)
1 4 5 7 | 3 6 2 → 반복 .. (target index = 1)
1 4 5 | 3 6 2 7 → 반복 .. (target index = 3)
1 4 | 3 6 2 7 5 → 반복 .. (target index = 2)
4 | 3 6 2 7 5 1 → 반복 .. (target index = 0)
3 6 2 7 5 1 4 → 정답 리스트
import sys
def print_ans(num) :
print("<", end="")
for n in num :
print(n, end="")
if n != num[-1] :
print(", ", end="")
print(">")
def Josephus_prob(n, k) :
josephus = [i for i in range(1, n + 1)]
answer = []
idx = k
for i in range(n) :
length = len(josephus)
while idx >= length :
idx -= len(josephus)
answer.append(josephus[idx])
josephus.pop(idx)
idx += k
print_ans(answer)
n, k = map(int, sys.stdin.readline().split())
Josephus_prob(n, k - 1)
for loop를 n번 순환하며 요세푸스 문제의 제거요소를 찾고 출력 시 n번 순환하기 때문에 총 O(2n)의 시간복잡도를 가진다. 하지만 n의 값이 커지면 O(n)과 O(2n)은 같아지므로 O(n)