하.. 해주면서 안되면 조건 추가하고 조건 추가하고,,, 이렇게 해도 되는건가 싶은 그런 느낌이였다 ㅎㅎ..
for i in range(k):
cnt += 1
if cnt == len(people):
cnt = 0
cnt(인덱스)를 k만큼 이동을 해주다가 list 인덱스를 벗어나게 되면, 맨 처음 인덱스로 가도록 하였다.
cnt -= 1
if cnt < 0:
cnt = len(people)-1
result.append(people[cnt])
people.pop(cnt)
일단, list의 인덱스가 0부터 시작이라서 cnt(인덱스)를 k만큼 이동시키면 한 칸 더 이동하는 셈이여서 -1을 해주었다.
그러다가 음수가 되면, 그래도 출력은 맨 끝 인덱스값으로 잘 나오지만, 다음 차례를 위해 len(people)-1로 해주었다.
그런데 이게 pop으로 값을 빼내주면서 인덱스 값이 하나씩 줄어들다보니, result에 값을 넣어주고 pop을 해주는 순간, cnt가 이미 인덱스 밖을 벗어난 상태(len(people)와 값이 같은 상태)가 되면, 맨 처음 인덱스로 이동되며, cnt를 -1를 해주면 안되게 된다...! 그래서 이미 cnt가 인덱스를 벗어난 상태라면 처음 인덱스부터 세어지도록 조건을 추가해주었다..ㅠ
# 요세푸스 문제 0
n, k = map(int, input().split(' '))
people = [i+1 for i in range(n)]
result = []
cnt = 0
while True:
if cnt == len(people):
cnt = 0
for i in range(k):
cnt += 1
if cnt == len(people):
cnt = 0
cnt -= 1
if cnt < 0:
cnt = len(people)-1
result.append(people[cnt])
people.pop(cnt)
if len(people) == 0:
break
print("<", end="")
for i in range(len(result)):
if i == len(result)-1:
print(result[i], end="")
else:
print(result[i], end=", ")
print(">")
아니 근데 알고리즘 분류를 클릭하니까 큐로,,,,, 푸는 문제.................?? ㅎㅎ.ㅎㅎㅎㅎ 몰랐다..!
그래서 큐보다는 덱이 편하니까,, 덱으로 다시 풀기 도전!! 아그리고 맨 마지막 출력 저렇게 해주는 거 뭔가 마음에 안들어서 다른 분들 코드를 참고하였다..!
# 요세푸스 문제 0_2 (덱으로 풀기)
from collections import deque
n, k = map(int, input().split(' '))
deq = deque(i+1 for i in range(n))
print("<", end="")
while deq: #덱에 값이 있을 때 참
for i in range(k-1):
deq.append(deq.popleft())
print(deq.popleft(), end="")
if deq:
print(", ", end="")
print(">")
조건문에 그냥 deq를 넣어주면 어떻게 되는거즤...라고 생각했는데 값이 들어있는 한에서는 참인 것 같다.. ㅇㅁㅇ
차례대로 popleft()해주고 다시 append를 해주며, k번째에 해당하는 수를 popleft()해서 빼버린다.!!
출력도 join을 사용해주어 더 간단하게 코드를 짤 수 있었다.
result = []
while deq:
for i in range(k-1):
deq.append(deq.popleft())
result.append(deq.popleft())
print("<" + ", ".join(map(str, result)) + ">"
참고한 사이트)
pacific-ocean.tistory.com/233
hon6036.github.io/%ED%81%90,%EB%8D%B1/11866/