문제

접근방식
(1) 1번 카드부터 N번 카드까지 위 -> 아래 상태로 놓여있으며, 반복하게 될 동작은 제일 위 (제일 먼저)에 있는 카드를 움직여야 하는 흐름의 문제인 것 파악하자.
(2) 제일 먼저 저장한 1번 카드를 제일 먼저 바닥에 버린다는 것은, 큐에 제일 먼저 offer() 한 것을 poll() 하는 것과 같다. (큐에서는, offer()된 순서대로 큐가 이루어지고, 이 순서와 같은 순서로 poll() 이 이루어진다.)
제출한 코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.Queue;
public class Main {
/**
* Todo:
* 1. BufferedReader를 사용하여 입력받을 수 있는 객체 br 생성
* 2. Integer 형식을 저장할 수 있는 큐 객체 q 생성
* 3. 정수 N 입력받기
* 4. 1부터 N까지의 수 큐에 넣기
* 5. 큐의 크기가 1보다 큰 동안 반복:
* - 큐에서 한 원소를 제거 (큐의 특성상 가장 먼저 저장된 원소부터 제거된다. 가장 위에 있는)
* - 다음 원소를 큐의 맨 뒤로 옮기기 (poll() -> offer())
* 6. 큐에서 마지막으로 남은 원소를 출력
*/
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
Queue<Integer> q = new LinkedList<>();
int N = Integer.parseInt(br.readLine());
for (int i = 0; i <= N; i++) {
q.offer(i);
while(q.size() > 1) {
q.poll();
q.offer(q.poll());
}
System.out.println(q.poll());
}
}
문제 파악하며 노트에 그림이나 글로 이해하고, psudo code를 잘 작성하자.