11866번: 요세푸스 문제 0
첫째 줄에 N과 K가 빈 칸을 사이에 두고 순서대로 주어진다. (1 ≤ K ≤ N ≤ 1,000)
www.acmicpc.net
❓문제 설명
문제 이해가 조금 어려웠는데, 쉽게 풀면
첫 번째 제거되는 사람은 1번을 기준으로 3번이 K번째이므로 3번이 제거된다.
두 번째 제거되는 사람은 4번을 기준으로 시작하여 K번째인 6번이 제거된다.
세 번째 제거되는 사람은 다시 7번을 기준으로 시작하여 K번째인 2번이 제거된다.
❗️문제 풀이
양방향 큐인 deque 자료구조를 이용했다.
deque의 rotate 함수는 원순열을 돌리는 함수이다.
deque.rotate(양수)
는 시계 방향으로, deque.rotate(음수)
는 반시계 방향으로 회전한다.
따라서 deque.rotate(K-1)
을 이용해 0번째 index를 제거될 값으로 맞추고, 해당 값을 pop으로 제거, 새로운 list에 append 했다.
이러면 제거된 값의 다음 값이 바로 기준값이 되기 때문에 바로 다음 K번째 값을 찾아갈 수 있다.
from collections import deque
N, K = map(int, input().split())
people_queue = deque()
answer_list = []
for i in range(N):
people_queue.append(i+1)
while people_queue:
people_queue.rotate(-(K-1))
answer_list.append(people_queue.popleft())
print("<", end="")
for i in range(N-1):
print(answer_list[i], end=", ")
print(answer_list[N-1], end="")
print(">")
'알고리즘 > BOJ' 카테고리의 다른 글
[BOJ] 1654: 랜선 자르기 (0) | 2024.06.25 |
---|---|
[BOJ] 12904: A와 B (0) | 2024.05.01 |
[BOJ] 13305: 주유소 (0) | 2024.04.30 |
[BOJ] 1406: 에디터 (0) | 2024.03.31 |
[BOJ] 9009: 피보나치 (2) | 2024.03.18 |