For Programmer

백준 11866번 파이썬 문제풀이(요세푸스 문제 0) 본문

코팅테스트/백준 문제 모음

백준 11866번 파이썬 문제풀이(요세푸스 문제 0)

유지광이 2022. 1. 24. 22:33
728x90

 


큐로 구현하면 간단하게 풀 수 있다. 우선 리스트의 원소들을 큐에 담고 0 부터 k-1번째까지의 원소를 맨뒤로 보내고 k 번째 원소(그렇게 되면 k 번째 원소가 맨앞에 오게 됨으로)를 출력할 리스트에 차근차근 담아준다.

 

from collections import deque

N, K = map(int, input().split())
K = K - 1
array = [x for x in range(1, N + 1)]
yosepoose = []  # 출력할 요세푸스 배열 선언

queue = deque(array)

while True:

    for i in range(K):  # k - 1 번째 까지 돈다.
        queue.append(queue.popleft())  # 큐의 맨 앞의 원소를 큐의 맨뒤로 순서대로 보낸다.
    yosepoose.append(queue.popleft())  # 출력할 리스트에 맨앞 원소부터 넣어 준다.

    if len(yosepoose) == len(array):  # 만약 요세푸스 원소의 길이가 입력받은 배열의 길이와 같아졌다면 반복문 탈출
        break

print('<' + ', '.join(map(str, yosepoose)) + '>')

 

재귀로 구현한 풀이도 있다. 알아두면 유용하다.

import sys

sys.setrecursionlimit(100000)

N, K = map(int, input().split())

array = [x for x in range(1, N + 1)]
result = []
index = 0  # 초기 index값 0


def move(index):
    # index가 0일때는 1번사람을 출력해야 하므로 index + 1을 해준다.
    # 만약 N이 7일 때 7번사람을 출력하기 위해서는 index가 0일때 이다.
    index = (index + 1) % N

    if array[index] != 0:  # 만약 아직 방문하지 않았다면
        return index  # 해당 index 반환
    else:  # 방문했다면
        return move(index)  # 그다음 인덱스로 넘어간다


for i in range(N):  # 총 N번 돌아야한다.
    for j in range(K):  # 무조건 K번 인덱스를 이동시켜야하기 때문에 K번 돈다.
        index = move(index)

    if index == 0:  # 만약 결과 index가 0이란건 7번째 사람을 뜻하므로
        result.append(N)  # N을 result에 넣어준다.

    else:  # 그 밖의 경우는 1~6 까지 이므로
        result.append(index)  # 그 값을 result값에 넣어준다.

    array[index] = 0

print('<' + ', '.join(map(str, result)) + '>')
728x90
Comments