자기개발👨‍💻/코딩 알고리즘

[python] 백준11866 요세푸스문제 0

천숭이 2021. 7. 12. 01:14

https://www.acmicpc.net/problem/11866

 

11866번: 요세푸스 문제 0

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

www.acmicpc.net

from collections import deque
n,k = map(int,input().split())
numbers = deque([i for i in range(1,n+1)])
cnt=0
result="<"
for i in range(n*k):
    cnt += 1
    if cnt==k:
        tmp=numbers.popleft()
        result+=str(tmp)+", "
        cnt=0
    else:
        tmp = numbers.popleft()
        numbers.append(tmp)

result=result[:-2]
result+=">"
print(result)

cnt는 k까지 가는 횟수이다. 따라서 cnt가 k일때와 아닐때로 경우를 나눴다.

인덱스를 사용하면 머리아파지므로 맨 앞에서 작업을 할 수 있게 반복문을 순회할때마다 pop한 값을 append해서 진행하기로 했다. 리스트였다면 연산 시간이 길어졌을테지만 deque를 사용하므로 실행시간을 대폭 줄일 수 있었다.

 

cnt가 k보다 작을때 :

맨 앞 수를 pop하고 tmp에 저장한다음 "tmp, "형태로 result에 추가한다.

k번째 수를 만났으므로 cnt는 0으로 초기화한다.

 

cnt가 k일때 :

tmp값을 numbers 뒤에 추가한다.