'U','D'가 입력되면 뒤에 나오는 수만큼 커서를 옮긴다.
'C'가 입력되면 해당 커서에 들어있는 값을 지우고 커서를 바로 아래로 옮긴다. 이 때, 지운 곳의 커서가 가장 아래였을 경우 지운 곳의 바로 위로 커서를 옮긴다.
'Z'가 입력되면 가장 최근에 삭제된 행을 원래돼로 복구한다. 단, 현재 커서의 위치는 바뀌지 않는다.
5 ≤ n ≤ 1,000
1 ≤ cmd의 원소 개수 ≤ 1,000
여기서 가장 중요한 것은 table을 set으로 생성하는 것이다. (set에 대한 기본 내용)
또, 지웠던 내용을 다시 되돌릴 때 필요한 hist를 stack으로 만들어둔다.
->Z가 나올 때마다 하나씩 역순으로 꺼내어 쓸 수 있도록
answer라는 문자열을 n의 크기만큼 'X'로 초기화한다.
입력으로 들어오는 cmd를 한 줄 씩 읽으며
해당 문자열의 가장 첫 문자가 'U' 또는 'D'일 때는 반복자를 사용하여 반복자의 위치를 뒤에 나오는 숫자만큼 옮기고
'C'일 때는 해당 반복자가 가리키는 곳의 값을 만들어둔 스택 hist에 저장해둔 뒤 table에서는 erase()한다.
'Z'의 경우에는 hist 스택에서 꺼내와 table에 다시 넣고 hist에서 pop()해준다.
이 때 table은 set으로 생성돼있기 때문에, 삽입을 하면 알아서 정렬된다.
이 점을 활용하여 이 문제는 처음에 'X'로 초기화해놓은 문자열 answer에서 table에 들어있는 곳의 index만 'O'로 바꿀 수 있다.
#include <set>
#include <iterator>
#include <string>
#include <vector>
#include <stack>
using namespace std;
string solution(int n, int k, vector<string> cmd) {
string answer(n,'X');
set<int> table;
stack<int> hist;
for(int i=0;i<n;i++) table.insert(i);
auto cur = table.find(k);
for(string s:cmd){
if(s[0]=='U' || s[0]=='D'){
int x = stoi(s.substr(2));
if(s[0]=='U') while(x--) cur = prev(cur);
else while(x--) cur = next(cur);
}
else if(s[0]=='C'){
hist.push(*cur);
cur = table.erase(cur);
if(cur==table.end()) cur = prev(cur);
}
else if(s[0]=='Z'){
table.insert(hist.top());
hist.pop();
}
else return "";
}
for(int i:table) answer[i]='O';
return answer;
}
좋은 내용 많이 얻어갑니다~!😀