N장의 카드가 있다. 각각의 카드는 차례로 1부터 N까지의 번호가 붙어 있으며, 1번 카드가 제일 위에, N번 카드가 제일 아래인 상태로 순서대로 카드가 놓여 있다.
이제 다음과 같은 동작을 카드가 한 장 남을 때까지 반복하게 된다. 우선, 제일 위에 있는 카드를 바닥에 버린다. 그 다음, 제일 위에 있는 카드를 제일 아래에 있는 카드 밑으로 옮긴다.
예를 들어N=4
인 경우를 생각해 보자. 카드는 제일 위에서부터1234
의 순서로 놓여있다.1
을 버리면234
가 남는다. 여기서2
를 제일 아래로 옮기면342
가 된다.3
을 버리면42
가 되고,4
를 밑으로 옮기면24
가 된다. 마지막으로2
를 버리고 나면, 남는 카드는4
가 된다.
N이 주어졌을 때, 제일 마지막에 남게 되는 카드를 구하는 프로그램을 작성하시오.
첫째 줄에 정수 N(1 ≤ N ≤ 500,000)이 주어진다.
첫째 줄에 남게 되는 카드의 번호를 출력한다.
✅ 카드 순서를 담을 큐
q
를 선언하고, 1 ~ n 까지의 수를 순서대로q
에 담아준다. 먼저 맨 위의 카드를 버려야 하므로poll()
메서드를 사용하여 출구 요소를 꺼낸다. 다음으로 그 다음 맨 위의 카드를 바닥에 넣어야 하므로poll()
을 통해 꺼낸 출구 요소를offer(poll())
를 통해 다시 맨 뒤에 넣어준다. 이 과정을 카드가 한 장 남을 때까지, 즉,q
에 저장된 요소가 1개보다 많을 때 반복을 수행한다.
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
Queue<Integer> q = new LinkedList<>();
int n = Integer.parseInt(br.readLine());
for(int i=1;i<=n;i++) {
q.offer(i);
}
while(q.size() > 1) {
q.poll();
q.offer(q.poll());
}
bw.write(q.peek() + "");
br.close();
bw.close();
}
}