[백준] 11866번 요세푸스 문제 0 파이썬

그린·2023년 3월 12일
0

백준

목록 보기
21/44
post-thumbnail

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


✔️문제

문제 설명

요세푸스 문제는 다음과 같다.

1번부터 N번까지 N명의 사람이 원을 이루면서 앉아있고, 양의 정수 K(≤ N)가 주어진다. 이제 순서대로 K번째 사람을 제거한다. 한 사람이 제거되면 남은 사람들로 이루어진 원을 따라 이 과정을 계속해 나간다. 이 과정은 N명의 사람이 모두 제거될 때까지 계속된다. 원에서 사람들이 제거되는 순서를 (N, K)-요세푸스 순열이라고 한다. 예를 들어 (7, 3)-요세푸스 순열은 <3, 6, 2, 7, 5, 1, 4>이다.

N과 K가 주어지면 (N, K)-요세푸스 순열을 구하는 프로그램을 작성하시오.

입력

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

출력

예제와 같이 요세푸스 순열을 출력한다.


✔️풀이

n, k = map(int, input().split())
arr = [i for i in range(1, n+1)]
answer = []
idx = k-1
count = 1
while True:
  answer.append(arr[idx])
  arr.remove(arr[idx])
  if not len(arr):
    break
  idx = idx+k-1
  if idx>=len(arr):
    idx = idx%len(arr)
print('<', end='')
for i in range(n):
  if i == n-1:
    print(answer[i], end=">")
  else:
    print(answer[i], end=', ')
  
  1. 인덱스가 k-1인 숫자를 answer 배열에 추가하고 원래 배열에서 제거한다.
  2. idx를 k-1만큼 증가시킨다. 만약 idx가 리스트의 길이를 넘어가면 길이로 나눈 나머지를 idx에 대입시킨다.
  3. idx에 해당하는 숫자를 차례로 제거하면서 answer 배열에 추가한다.
  4. 더이상 제거할 숫자가 남아있지 않으면 answer를 규칙에 맞게 출력한다.

새로운 배열을 추가해서 제거된 숫자들을 순서대로 추가하지 않고, pop() 사용할 수 있음을 생각해내고 수정한 코드이다.

n, k = map(int, input().split())
arr = [i for i in range(1, n+1)]
idx = k-1
count = 1
print("<", end='')
for _ in range(n-1):
  print(arr.pop(idx), end=", ")
  idx = idx+k-1
  if idx>=len(arr):
    idx = idx%len(arr)
print(arr[0], ">", sep="")

0개의 댓글