
오늘은 알고리즘 문제를 풀면서
무적 8조 안태주씨가 큐를 이용해서 기가막히게 풀었다.
나는 원래 어떻게 풀었었는지
태주씨는 큐를 이 문제를 푸는데에 어떻게 이용했는지 살펴보면서
컴퓨팅사고에 좀 더 가까워지러 가볼까?
문제
요세푸스 문제는 다음과 같다.
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>
from collections import deque
queue = deque()
result = []
n,k = map(int, input().split(' '))
for i in range(1,n+1):
queue.append(str(i))
count = k - 1
while len(queue) > 0:
number = count % len(queue)
result.append(queue[number])
del queue[number]
count = number + k - 1
print(f"<{', '.join(result)}>")
아주 난리 부르스 오만 난리 쌩 난리를 쳐놨다.
count 구해놔서 거기에 number 로 나머지해서 뭐 number에
k 더했다가
1 뺏다가
카운터에 기록해놨다가 아주
"큐 문제"를 가지고 수학으로 난리부르스 쌩난리를 쳤다.
그럼 이 문제를 어떻게 "큐" 적으로 해결할 수 있을까?

일단 기본적으로 이 문제는
3번째 인덱스에있는 놈을 빼서 저장해주면 된다. 그리고 그걸 따로 배열에 저장해뒀다가 정답에 쓰면 된다.
그럼 이렇게 하면 되잖아!

맨 앞에 두개를 뒤로보내준다.
그리고 3번째 아이템을.. pop() 한다.
이걸 반복...
그럼 이렇게 된다.

이걸 queue 의 pop과 append 로 구현한다면...??
오마이 갓 이렇게 쉽다고??
게다가 "큐 스럽잖아"
무적 8조 안태주...이 똑똑한 놈..!!
조금더 자료구조와 알고리즘적인 사고를 하게 하는 느낌이다.
적절한 것을 써서 문제를 적절하게 해결하는 것.
그렇게 풀려고 노력해봐야겠다.
요세푸스 얼굴 기억해놨다 조심해라