코딩테스트연습/백준

[백준 - JAVA] 18115번 : 카드 놓기

:)jun 2023. 2. 6. 16:25

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

 

18115번: 카드 놓기

수현이는 카드 기술을 연습하고 있다. 수현이의 손에 들린 카드를 하나씩 내려놓아 바닥에 쌓으려고 한다. 수현이가 쓸 수 있는 기술은 다음 3가지다. 제일 위의 카드 1장을 바닥에 내려놓는다.

www.acmicpc.net

 

취업 스터디 덕분에 알고리즘을 다시 블로그에 올리게 됐습니다. 취업 스터디 감사합니다.

어떤 3가지 작업을 실행했더니 1 ~ N 으로 정렬이 되었다! 그럼 반대로 돌려봐라!

아래에서부터 N->1 로 쌓여 있었기 때문에 1부터 N까지 순서대로 반대 작업을 수행하면 된다.

 

1번의 반대 작업은 첫번째 순서에 넣으면 된다.

2번의 반대 작업은 두번째 순서에 넣으면 된다.

3번의 반대 작업은 마지막 순서에 넣으면 된다.

 

값을 앞뒤로 넣으면서 저장할 수 있는 자료구조는 deque가 적합하다.

deque 를 구현할 수 있는 구현체는 LinkedList와 ArrayList가 있는데 대부분 맨 앞과 맨 뒤에 추가 삭제를 하기 때문에 ArrayList로 작업했다. 만약 LinkedList로 진행했다면 불필요한 메모리 낭비가 있었을 것이다. 코드는 다음과 같다.

import java.io.*;
import java.util.ArrayDeque;
import java.util.Deque;
import java.util.StringTokenizer;

public class Q_18115 {
    static Deque<Integer> deque = new ArrayDeque<>();
    static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
    static StringTokenizer st;

    public static void main(String[] args) throws IOException {
        int N = Integer.parseInt(br.readLine());
        String command = new StringBuffer(br.readLine()).reverse().toString();
        StringTokenizer st = new StringTokenizer(command);

        for(int i = 1; i <= N; i++) {
            switch (Integer.parseInt(st.nextToken())) {
                case 1 : doOne(i); break;
                case 2 : doTwo(i); break;
                case 3 : doThree(i); break;
            }
        }

        while(!deque.isEmpty()) {
            bw.write(deque.poll() + " ");
        }
        bw.close();
    }

    private static void doOne(int i) {
        deque.offerFirst(i);
    }

    private static void doTwo(int i) {
        int temp = deque.pollFirst();
        deque.offerFirst(i);
        deque.offerFirst(temp);
    }

    private static void doThree(int i) {
        deque.offerLast(i);
    }

}