링크 : https://www.acmicpc.net/problem/18115
문제 설명
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]
2번 카드를 2번 기술로 내려놓는다.
→ [1,2]
3번 카드를 3번 기술로 내려놓는다.
→ [1,2,3]
4번 카드를 3번 기술로 내려놓는다.
→ [1,2,3,4]
5번 카드를 2번 기술로 내려놓는다.
→ [1,5,2,3,4]
문제 풀이
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();
}
}