문제 풀이/백준

[백준]2164번. 카드2 (JAVA)

27200 2024. 4. 4. 15:51

https://www.acmicpc.net/problem/2164


문제


풀이

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));
        StringTokenizer st;

        st = new StringTokenizer(br.readLine());

        int n = Integer.parseInt(st.nextToken());

        Queue<Integer> queue = new LinkedList<>();

        for(int i = 1; i < n+1; i++){
            queue.add(i);
        }

        int check = 1;

        while (queue.size() > 1){
            if(check % 2 == 1){
                queue.poll();
            }else{
                int temp = queue.poll();
                queue.add(temp);
            }
            check++;
        }

        System.out.println(queue.poll());
    }
}

가장 먼저 들어간 것이 먼저 나오는 선입선출 구조를 띄고 있기 때문에 큐 자료구조를 사용했다.

 

추가적으로 반복 횟수에 따라 동작이 달라지므로 주기가 2인 동작을 처리하기 위해 check라는 변수를 두어 처리했다. 

다만 실제 문제 제출본은

       while (queue.size() > 1){
            if(check == 1){
                queue.poll();
                check--;
            }else{
                int temp = queue.poll();
                queue.add(temp);
                check++;
            }
        }

로 제출했다. 이유는 위의 풀이대로면 한번의 while반복마다 %2, ==1, ++로 3번의 연산이 들어가게 된다. 하지만 아래와 같이 수정하면 ==1, ++ or --로 2번의 연산으로 처리가 가능하기 때문이다. 사소하지만 언제나 중요하게 처리하는 습관을 들여야할 것 같다.

또한 이 문제 역시 for(int i = 1; i <=n  or i <n+1; i++)로 처리해야 함에 주의하자.