링크 : https://www.acmicpc.net/problem/1158
파이썬 코드
from collections import deque
N,K=map(int,input().split())
q = deque()
for i in range(N):
q.append(i+1)
i=0 #제거될 사람의 인덱스
li=[] #제거된 사람이 들어가는 리스트
while True:
i+=1
if i < K and q:
q.append(q.popleft())
elif i == K and q:
li.append(q.popleft())
i=0
else:
break
result="".join(str(li)[1:-1])
print("<",end="")
print(result,end="")
print(">")
앞뒤에서 자유롭게 삭제와 추가가 가능한 deque을 사용하여 풀었다.
루프를 돌면서, 초기의 K번째 전의 사람을 큐에서 제거한 후, 큐의 맨 뒤에 추가한다.
이 과정을 반복하면 초기의 K번째 사람이 큐의 맨 앞에 위치하게 된다. 맨 앞에 위치하게 됐을 때, K번째 사람을 제거하고 i를 다시 0으로 초기화해준다.
처음엔 while True문 말고, for문 안에서 i를 선언하여 사용했는데, 당연히 제대로 풀리지 않았다.
i가 계속해서 커지기 때문에 처음 K번째가 되는 사람만 제거되고, 그 이후엔 제거되지 않는다. 즉, 한 바퀴만 돌게 되는 것이다..
제거될 사람의 인덱스를 전역변수로 선언해야 한다.
그리고 이 문제는 출력문에 유의해야 한다.
출력문 형식을 무시하는 바람에 처음엔 오답처리가 됐다.
리스트를 str형으로 바꿔주고 join을 사용해서 형식에 맞추었다.