class Queue {
items = [];
front = 0;
rear = 0;
pop() {
return this.items[this.front++];
}
push(item) {
this.items.push(item)
this.rear++;
}
isEmpty() {
return this.front === this.rear
}
}
pop : O(1)(상수 시간)push : O(1)isEmpty : O(1)(코딩테스트 합격자되기 도서 참고)
N과 K가 주어질 때 마지막에 살아 남은 사람의 번호는?
class Queue {
items = [];
front = 0;
rear = 0;
size() {
return this.rear - this.front;
}
pop() {
return this.items[this.front++];
}
push(item) {
this.items.push(item);
this.rear++;
}
}
function Josephus(n, k) {
const queue = new Queue();
//1부터 n까지 queue에 넣기
for(let i = 1; i <= n; i++) {
queue.push(i);
}
// 한 사람이 남을 때까지 반복
while(queue.size() > 1) {
// k-1번째 사람은 pop+ push
for(let i = 0; i < k-1; i++) {
queue.push(queue.pop());
}
queue.pop();
}
return queue.pop();
// 마지막에 남아있는 사람의 번호
}