🖇️ 문제 링크
📝 문제 분석
최대 100만개의 원소가 있고, 최대 20만번의 명령을 수행해야 합니다.
삭제 명령이 있기 때문에 배열을 사용하게 된다면 시간 내에 수행할 수 없습니다.
양방향 연결리스트
를 구현하여 원소 삭제
와 원소 복원
명령 수행시간을 최소화합니다.
가장 최근에 삭제한 원소를 복구시키기 위해, 삭제 했던 원소를 스택에 저장시켜놓습니다. 복구할 때는, 삭제한 원소의 원래 prev 노드와 next노드의 중간에 연결시켜줍니다.
⌨️ 코드
import java.util.*;
class Solution {
public String solution(int n, int k, String[] cmd) {
Node[] nodeArr = new Node[1000000];
for(int i = 0; i < n; i++)
nodeArr[i] = new Node();
for(int i = 1; i < n; i++) {
nodeArr[i - 1].next = nodeArr[i];
nodeArr[i].prev = nodeArr[i - 1];
}
Deque<Node> stk = new ArrayDeque<>();
Node curr = nodeArr[k];
for(String str : cmd) {
char c = str.charAt(0);
switch(c) {
case 'U' :
int x = Integer.parseInt(str.substring(2));
for(int i = 0; i < x; i++)
curr = curr.prev;
break;
case 'D' :
x = Integer.parseInt(str.substring(2));
for(int i = 0; i < x; i++)
curr = curr.next;
break;
case 'C' :
curr.removed = true;
stk.push(curr);
Node up = curr.prev;
Node down = curr.next;
if(up != null)
up.next = down;
if(down != null) {
down.prev = up;
curr = down;
} else {
curr = up;
}
break;
case 'Z' :
Node recover = stk.pop();
up = recover.prev;
down = recover.next;
recover.removed = false;
if(up != null) {
up.next = recover;
}
if(down != null) {
down.prev = recover;
}
break;
}
}
StringBuilder sb = new StringBuilder();
for(int i = 0; i < n; i++) {
if(nodeArr[i].removed)
sb.append("X");
else
sb.append("O");
}
return sb.toString();
}
class Node {
boolean removed;
Node prev;
Node next;
}
}
Uploaded by Notion2Tistory v1.1.0