Algorithm/Stack & Queue

[Python] 백준 1158번 요세푸스 문제

코딩쪼앙 2023. 6. 17. 19:00

문제

 

1158번: 요세푸스 문제

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

www.acmicpc.net

입력

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

출력

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

입력 예제

7 3

출력 예제

<3, 6, 2, 7, 5, 1, 4>

문제 풀이

  • k - 1 번째 값까지 pop해서 큐의 뒤에 붙인다.
  • 그 후, 맨 앞의 값이 k번째 값이므로, pop해서 answer에 붙인다.
  • 위 과정 반복하여, answer에 요세푸스 순열 저장 후, 출력 형식 맞추기 위해, answer의 값들을 int가 아닌 문자로 바꾼다.
  • 형식에 맞게 출력한다.

코드

from collections import deque
n,k = map(int,input().split())
queue = deque(range(1,n+1))
answer = []

# k - 1 번째 값까지 뒤에 붙이기
while queue:
    for i in range(k - 1):
        queue.append(queue.popleft())
    # 맨 앞에 있는 값 answer 에 붙이기
    answer.append(queue.popleft())
answer = list(map(str,answer))
print(f'<',', '.join(answer),f'>',sep='')