[백준 1158 파이썬] - 요세푸스 문제

zsunny·2022년 7월 27일
1

📌 문제

💯 정답

import sys
input = sys.stdin.readline

n, k = map(int, input().split())
plist = list(i for i in range(1, n+1))

ans = []
num = 0

for _ in range(n):
    num += k-1                          # 인덱스 0부터 시작이니까 -1해서 누적
    if num >= len(plist):               # 한 바퀴 넘어가면
        num %= len(plist)               # 찾는 인덱스 재정의
    ans.append(str(plist.pop(num)))     # plist에서 인덱스가 num인 값 pop

print("<",", ".join(ans), ">", sep="")

📝 설명

• num이 제거해야하는 사람의 인덱스를 가리키는 변수라고 할때,
  num은 0부터 시작하고 사람은 1번부터 시작하므로 k-1로 누적해나가야 한다.
  (또한, 한 사람을 제거한후 뒷 순서 사람의 인덱스도 1이 줄기 때문이다)

• num이 한바퀴를 돌아 오면 그동안 누적되었던 값을 reset하고 다시 정의해야한다.
  이 값은 현재 사람의 수로 나눈 나머지값으로 정의하면 된다.

• 위의 로직을 따른 후 해당하는 num값을 인덱스로 가지는 값을 pop하면 된다.

🙏 참고

👉 백준 (boj) 파이썬 - 1158 요세푸스 문제

profile
매일 성장하는 예비 웹 개발자 🌱

0개의 댓글