# Topic : Data_Structure _ 요세푸스 문제
#
# PyPy 3 : 116ms
import sys
N , K = map(int,sys.stdin.readline().split())
yoseps = [i+1 for i in range(N)] # 1~N 의 list 생성
result = list() # 결과를 저장할 list
i = 0 # yoseps list를 돌아다닐 index
while len(yoseps) != 0: # yoseps list의 모든 요소가 사라져 길이가 0이 될때까지 loop
i = (i+K-1) % len(yoseps) # * 직전 index 위치에서 K만큼 이동(+K-1)후 list의 길이로 mod 연산(인덱스 넘어가면 리스트 앞쪽으로 전환)
result.append(yoseps[i]) # 해당 요소를 result에 저장 후
del yoseps[i] # yoseps list에서는 없애준다.
# < ~ > 형식으로 만들어준다.
result = str(result)
result = result.replace('[','<')
result = result.replace(']','>')
print(result)
메모리 : 114328 KB 시간 : 116 ms
원형의 접근 순서를 mod 연산으로 처리하고 yoseps list에서 하나씩 제거해나가면서 index를 돌리면 되겠다 생각.
Queue 로 푼 사람이 있는데 이 문제에 한에서는 비효율적이라고 한다.
양방향 Queue(deque)를 사용하여 풀 수 있다.
from collections import deque
N, K = map(int,sys.stdin.readline().split())
yoseps = deque([i+1 for i in range(N)])
result = list() # 결과를 저장할 list
# 중식당 테이블처럼 원하는 요소를 내 앞으로 가져다 놓는 형식이다.
for i in range(N - 1):
for _ in range(K - 1):
yoseps.append(yoseps.popleft()) # 좌측에 있는 요소를 우측에 붙인다.(K번째 움직인 요소를 맨 좌측에 놓기 위해서)
result.append(yoseps.popleft()) # 현재 가장 왼쪽에 있는 요소를 result에 저장
# < ~ > 형식으로 만들어준다.
result = str(result)
result = result.replace('[','<')
result = result.replace(']','>')
print(result)
메모리 : 248044 KB 시간 : 480 ms
⇒ 근데 이 친구 메모리랑 시간은 더쓴다.