노드 구조체를 만들어서 구조체 안에 인덱스 번호를 만들어서
하나하나 연결을 시킬까 생각을 했지만!
문제를 읽어보면 행번호가 연속적이다라는 것을 확인할 수 있어서
구조체 멤버로 인덱스 번호를 사용할 필요는 없다는 것을 캐치해야 한다.
'C'나 'Z'에서 노드를 연결할때 0번재 인덱스의 prev와 마지막 인덱스 노드의 next
는 nullptr이라는 것을 염두해두고 예외처리해야 한다.
#include <string>
#include <vector>
#include <stack>
using namespace std;
struct Node
{
bool check;
Node *next;
Node *prev;
};
Node node[1000000];
string solution(int n, int k, vector<string> cmd) {
string answer = "";
//n은 8이라고 할 때
for(int i = 1; i < n; i++)
{
node[i - 1].next = &node[i];
node[i].prev = &node[i - 1];
}
stack<Node *>myStack;
Node *cur = &node[0];
//선택행 맞추기
for(int i = 0; i < k; i++)
{
cur = cur->next;
}
for(string word : cmd)
{
if(word[0] == 'U')
{
int pos = stoi(word.substr(2));
for(int i = 0; i < pos; i++)
{
cur = cur->prev;
}
}
else if(word[0] == 'D')
{
int pos = stoi(word.substr(2));
for(int i = 0; i < pos; i++)
{
cur = cur->next;
}
}
else if(word[0] == 'C')
{
myStack.push(cur);
cur->check = true;
Node *up = cur->prev;
Node *down = cur->next;
//삭제할때 down이 null이라면 위에거를 cur로 설정하자
//0번재 인덱스가 선택될수도 있다....
if(up)
up->next = down;
if(down)
down->prev = up;
if(down != nullptr)
{
cur = down;
}
else
{
cur = up;
}
}
//스택을 이용해서 복구하자.
else if(word[0] == 'Z')
{
Node *Add = myStack.top();
myStack.pop();
Add->check = false;
//Add는 주소남겨져 있으므로 그대로 활용하자.
Node *up = Add->prev;
Node *down = Add->next;
if(up)
up->next = Add;
if(down )
down->prev = Add;
}
}
for(int i = 0; i < n; i++)
{
if(node[i].check == true)
{
answer += 'X';
}
else
{
answer += 'O';
}
}
return answer;
}