처음에 ArrayList로 구현했으나 효율성 테스트 실패.
→ 배열로 LinkedList를 직접 구현해서 해결했다.
remove(index), add(index, value) 가 O(n)int[] prev = new int[n+2]; // 이전 행 인덱스
int[] next = new int[n+2]; // 다음 행 인덱스
삭제/복구가 모두 O(1)!
삭제 전: ... ↔ 2 ↔ [3] ↔ 4 ↔ ...
C (삭제):
next[prev[3]] = next[3] → 2의 다음을 4로
prev[next[3]] = prev[3] → 4의 이전을 2로
결과: ... ↔ 2 ↔ 4 ↔ ...
(3은 연결에서 제외되지만 prev[3]=2, next[3]=4는 유지!)
Z (복구):
next[prev[3]] = 3 → 2의 다음을 다시 3으로
prev[next[3]] = 3 → 4의 이전을 다시 3으로
결과: ... ↔ 2 ↔ 3 ↔ 4 ↔ ...
next[0] = 1, prev[n+1] = nnextNow == n+1이면 위로, 아니면 아래로import java.util.*;
class Solution {
public String solution(int n, int k, String[] cmd) {
StringBuilder answer = new StringBuilder();
int[] prev = new int[n+2];
int[] next = new int[n+2];
for (int i = 1; i <= n; i++) {
prev[i] = i-1;
next[i] = i+1;
}
next[0] = 1;
prev[n+1] = n;
int now = k+1;
Stack<Integer> stack = new Stack<>();
for (String line : cmd) {
StringTokenizer st = new StringTokenizer(line);
String token = st.nextToken();
if (token.equals("D")) {
int num = Integer.parseInt(st.nextToken());
for (int i = 0; i < num; i++) now = next[now];
}
else if (token.equals("U")) {
int num = Integer.parseInt(st.nextToken());
for (int i = 0; i < num; i++) now = prev[now];
}
else if (token.equals("C")) {
stack.push(now);
int prevNow = prev[now];
int nextNow = next[now];
next[prevNow] = nextNow;
prev[nextNow] = prevNow;
now = (nextNow == n+1) ? prevNow : nextNow;
}
else {
int num = stack.pop();
next[prev[num]] = num;
prev[next[num]] = num;
}
}
boolean[] check = new boolean[n+1];
while (!stack.isEmpty()) check[stack.pop()] = true;
for (int i = 1; i <= n; i++) {
answer.append(check[i] ? "X" : "O");
}
return answer.toString();
}
}