[Java] 백준 18115 카드 놓기

이현희·2024년 6월 20일

📌 서론.

📚 오늘의 문제.

📝 문제 1.

링크 : https://www.acmicpc.net/problem/18115

  1. 문제 설명

    1번 기술 ) 제일 위의 카드 1장을 바닥에 내려놓는다.

    2번 기술 ) 위에서 두 번째 카드를 바닥에 내려놓는다. 카드가 2장 이상일 때만 쓸 수 있다.

    3번 기술 ) 제일 밑에 있는 카드를 바닥에 내려놓는다. 카드가 2장 이상일 때만 쓸 수 있다.

    위 3가지 기술을 사용해서 카드를 내려 놓았을 때, 최종적으로 놓여 있는 카드는 1~N였다.

    그러면 사용한 기술이 순서대로 주어졌을 때, 처음 놓여 있던 카드의 상태를 구하는 문제이다.

    💡 아이디어 : 앞에서부터 행했던 행동들을 반대로 뒤에서부터 행하면 된다!

    예제 2) n=5, 2 3 3 2 1

    [1,2,3,4,5] 를 1 2 3 3 2 순(역방향)으로 카드 놓기

    1. 1번 카드를 1번 기술로 내려놓는다.

      → [1]

    2. 2번 카드를 2번 기술로 내려놓는다.

      → [1,2]

    3. 3번 카드를 3번 기술로 내려놓는다.

      → [1,2,3]

    4. 4번 카드를 3번 기술로 내려놓는다.

      → [1,2,3,4]

    5. 5번 카드를 2번 기술로 내려놓는다.

      [1,5,2,3,4]

  2. 문제 풀이

    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));
    
            int n = Integer.parseInt(br.readLine());
            StringTokenizer st = new StringTokenizer(new StringBuilder(br.readLine()).reverse().toString());
            Deque<Integer> q = new ArrayDeque<>();
            StringBuilder answer = new StringBuilder();
    
            for (int i = 1; i <= n; i++) {
                int command = Integer.parseInt(st.nextToken());
                switch (command) {
                    case 1:
                        q.addFirst(i);
                        break;
                    case 2:
                        int top = q.pollFirst();
                        q.addFirst(i);
                        q.addFirst(top);
                        break;
                    case 3:
                        q.addLast(i);
                        break;
                }
            }
    
            while (!q.isEmpty()) {
                answer.append(q.pollFirst() + " ");
            }
    
            bw.write(answer.toString());
            bw.close();
            br.close();
        }
    }
    

0개의 댓글