문제 보기: https://www.acmicpc.net/problem/11866
문제
요세푸스 문제는 다음과 같다.
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)
출력
예제와 같이 요세푸스 순열을 출력한다.
풀이 과정
1. 원형 구조일때 deque를 사용했던 것과 for문 안에서의 변수가 유지되고 나왔을때 유지 되지 않는 것을 이용하여 작성
2. deque를 정의하고 while문 안의 for문에서 이 que를 하나씩 팝을 해가면서 실제로 빼야하는 수 앞까지 진행
3. for문을 탈출하면서 answer에 팝된 값을 붙이면서 하나를 pop해주고 이를 반복
4. queue의 값이 없어지면 자동으로 while문을 탈출하게 된다.
5. 이렇게 answer를 만든값을 출력 값의 형태에 맞춰서 출력해주면 되겠다.
코드
from collections import deque
queue = deque()
answer = []
n, k = map(int, input().split())
for i in range(1, n+1):
queue.append(i)
while queue:
for i in range(k-1):
queue.append(queue.popleft())
answer.append(queue.popleft())
print("<",end='')
for i in range(len(answer)-1):
print("%d, "%answer[i], end='')
print(answer[-1], end='')
print(">")
'Algorithm' 카테고리의 다른 글
[백준_1541] 잃어버린 괄호 (0) | 2022.05.19 |
---|---|
[백준_9184] 신나는 함수 실행 (0) | 2022.05.18 |
[백준_1003] 피보나치 함수 (0) | 2022.05.15 |
[백준_2231] 분해합 (0) | 2022.05.14 |
[백준_2798] 블랙잭 (0) | 2022.05.13 |