코딩 테스트/백준

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

위시리 2024. 9. 11. 01:11

 

문제 분석

  • 1부터 N번까지 N명의 사람이 원을 이루며 앉아있고
  • 양의 정수 k가 주어짐
  • 순서대로 k번째 사람 제거
  • 한 사람이 제거되면 남은 사람들로 이루어진 원을 따라 이 과정을 계속 함
  • N명의 사람이 모두 제거될 때 까지 계속

 

코드 설계

  • 제거된 수에 대해 +3 위치의 숫자 제거
  • 앞의 2개 빼서 뒤로 보내고 마지막 3번째 pop해서 출력하기에는.. 너무 복잡하지 않나..

 

정답 코드

import sys
input = sys.stdin.readline

from collections import deque

n, k = map(int, input().split())
d = deque([i for i in range(1, n+1)])
ans = []

while len(d) > 0 :
    for _ in range(k-1) :
        tmp = d.popleft()
        d.append(tmp)
    ans.append(d.popleft())

print('<', end='')
for i in range(len(ans)) :
    print(ans[i], end='')
    if i < len(ans)-1 :
        print(', ', end='')
print('>')

 

다른 사람 코드 1

import sys
from collections import deque

# 입력 받기
n, k = map(int, input().split())

# 양방향 연결 리스트(deque) 생성
deq = deque([i for i in range(1, n+1)])

# 요세푸스 순열 생성
res = []
while len(deq) != 0:
    for _ in range(k-1):
        # k-1번째 노드까지 deq 맨 뒤로 이동
        deq.append(deq.popleft())
    # k번째 노드 삭제 후 결과 배열에 추가
    res.append(str(deq.popleft()))

# 결과 출력
print('<'+', '.join(res)+'>')