연결리스트 : 카카오 - 표편집

phoenixKim·2021년 10월 13일
0

카카오 기출문제

목록 보기
24/24

풀이전략

  • 노드 구조체를 만들어서 구조체 안에 인덱스 번호를 만들어서
    하나하나 연결을 시킬까 생각을 했지만!
    문제를 읽어보면 행번호가 연속적이다라는 것을 확인할 수 있어서
    구조체 멤버로 인덱스 번호를 사용할 필요는 없다는 것을 캐치해야 한다.

  • '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;
}
profile
🔥🔥🔥

0개의 댓글

관련 채용 정보