[Python] 백준 - 11866번

SMongS·2022년 8월 17일
0

CodingTest

목록 보기
27/49

요세푸스 문제 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)

출력

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

예제 입력

7 3

예제 출력

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

코드

import sys
from collections import deque

queue = deque()
result = []

n, k = map(int, sys.stdin.readline().split());

for i in range(1, n+1):
    queue.append(i)

while queue:
    for i in range(k-1):
        queue.append(queue.popleft())
    result.append(queue.popleft())

print("<", end='')
print(', '.join(map(str,result)), end='')
print(">")

예제처럼 N과 K가 각각 7과 3이라면 1번부터해서 3번에 위치한 값이 제거가 됩니다.
그리고 제거된 다음 값부터 3번째에 위치한 값이 제거되는 방식입니다.

이 문제는 큐 자료구조 중에 덱/데큐(Deque)인 것 같습니다.

collections에서 deque를 import하고
변수명 = deque()를 선언해서 deque를 사용합니다.

queue.append()로 배열에 값을 넣습니다.

queue.popleft()는 가장 왼쪽의 요소를 반환하고 삭제해줍니다.

그래서 3번째가 오기전의 값들은 꺼내서 다시 queue 배열에 추가해서 뒤에 가도록 합니다.

3번째가 되면 result 배열에 추가해줍니다.

profile
반갑습니당~😄

0개의 댓글