"U X": 현재 선택된 행에서 X칸 위에 있는 행을 선택합니다.
"D X": 현재 선택된 행에서 X칸 아래에 있는 행을 선택합니다.
"C" : 현재 선택된 행을 삭제한 후, 바로 아래 행을 선택합니다. 단, 삭제된 행이 가장 마지막 행인 경우 바로 윗 행을 선택합니다.
"Z" : 가장 최근에 삭제된 행을 원래대로 복구합니다. 단, 현재 선택된 행은 바뀌지 않습니다.
처음 표의 행 개수를 나타내는 정수 n, 처음에 선택된 행의 위치를 나타내는 정수 k, 수행한 명령어들이 담긴 문자열 배열 cmd가 매개변수로 주어질 때, 모든 명령어를 수행한 후 표의 상태와 처음 주어진 표의 상태를 비교하여 삭제되지 않은 행은 O, 삭제된 행은 X로 표시하여 문자열 형태로 return 하도록 solution 함수를 완성해주세요.
처음 코테에서 풀었는데 그때는 ListIterator로 풀려고 시도했다.
그때 에러때문에 못풀었던거 같다.
다시 보니 현재 위치만 저장해주고 stack으로 Z기능을 완성하면 될거 같았다.
import java.util.LinkedList;
import java.util.Stack;
class Solution {
public String solution(int n, int k, String[] cmd) {
String answer = "";
Stack<Integer> order = new Stack<Integer>();
Stack<Integer> index = new Stack<Integer>();
LinkedList<Integer> graph = new LinkedList<>();
for(int i=0; i<n; i++)
graph.add(i);
for(int i=0; i<cmd.length; i++) {
char c = cmd[i].charAt(0);
if(c=='D')
k+=Integer.parseInt(cmd[i].substring(2));
else if(c=='U')
k-=Integer.parseInt(cmd[i].substring(2));
else if(c=='C') {
order.add(k);
index.add(graph.get(k));
graph.remove(k);
if(k==graph.size())
k--;
}
else if(c=='Z') {
graph.add(order.peek(), index.pop());
if(order.pop()<=k)
k++;
}
//System.out.println(k);
}
int temp_index=0;
for(int i=0; i<n; i++)
{
if(i==graph.get(temp_index)) {
answer+="O";
temp_index++;
}
else
answer+="X";
}
return answer;
}
}
응~ 시간초과
정확성도 3개 정도 런타임에러가 있다.
시간초과가 나는 이유는 LinkedList때문인거 같다.
LinkedList의 remove와 add는 시간 복잡도가 O(1)인데
실제로 탐색때는 처음부터 탐색해서 삭제할곳을 찾기 때문에
O(n)이 시간 복잡도이다.
푸는 방법을 달리 해야한다.
다른 분 거를 참고했다.
놀랍게도 LinkedList 사용 안해도됨ㅋㅋㅋㅋㅋ
아주 놀라운 풀이였다
import java.util.LinkedList;
import java.util.Stack;
class Solution {
public String solution(int n, int k, String[] cmd) {
Stack<Integer> remove_order = new Stack<Integer>();
int table_size = n;
for(int i=0; i<cmd.length; i++) {
char c = cmd[i].charAt(0);
if(c=='D')
k+=Integer.parseInt(cmd[i].substring(2));
else if(c=='U')
k-=Integer.parseInt(cmd[i].substring(2));
else if(c=='C') {
remove_order.add(k);
table_size--;
if(k==table_size)
k--;
}
else if(c=='Z') {
if(remove_order.pop()<=k)
k++;
table_size++;
}
}
StringBuilder builder = new StringBuilder();
for(int i=0; i<table_size; i++)
builder.append("O");
while(!remove_order.isEmpty())
builder.insert(remove_order.pop().intValue(), "X");
String answer=builder.toString();
return answer;
}
}