https://school.programmers.co.kr/learn/courses/30/lessons/81303
연결 리스트
를 활용하면 아주 편하게 구현이 가능하다.연결 리스트
를 활용하는 이유는 복원에 아주 최적화가 되어 있기 때문이다import java.util.*;
class Solution {
public class Node {
int n;
Node prev;
Node next;
public Node(int n, Node prev, Node next) {
this.n = n;
this.prev = prev;
this.next = next;
}
}
public String solution(int n, int k, String[] cmd) {
//초기화
char[] result = new char[n];
Arrays.fill(result, 'O');
Stack<Node> stack = new Stack<>();
Node cur = new Node(-1, null, null);
for (int i = 0; i < n; i++) {
Node next = new Node(i, cur, null);
cur.next = next;
cur = next;
}
cur.next = new Node(-1, cur, null);
//현재 cur은 n-1번째 노드
for (int i = 0; i < n-k-1; i++)
cur = cur.prev;
//현재 cur은 k번째 노드
//명령 실행
StringTokenizer st;
for (String c : cmd) {
st = new StringTokenizer(c);
String first = st.nextToken();
if (first.equals("U")) {
int num = Integer.parseInt(st.nextToken());
while(num-- > 0)
cur = cur.prev;
} else if (first.equals("D")) {
int num = Integer.parseInt(st.nextToken());
while(num-- > 0)
cur = cur.next;
} else if (first.equals("C")) {
Node prev = cur.prev;
Node next = cur.next;
result[cur.n] = 'X';
stack.push(cur);
prev.next = next;
next.prev = prev;
if (next.n != -1) cur = next;
else cur = prev;
} else if (first.equals("Z")) {
Node recover = stack.pop();
result[recover.n] = 'O';
Node prev = recover.prev;
Node next = recover.next;
prev.next = recover;
next.prev = recover;
}
}
return String.valueOf(result);
}
}