1 분 소요

표편집 (프로그래머스 Level 3)

https://school.programmers.co.kr/learn/courses/30/lessons/81303

스택을 사용하는 것과 ‘연결 리스트’를 사용하는 것은 떠올릴 수 있었으나
세부적인 연결 리스트를 구현하는 중,
실패와 세그먼트 폴트가 발생하여, 복습을 할 겸
다른 블로그를 보게 되었다
(https://eunchanee.tistory.com/677)

양 방향 연결 리스트로, 각 데이터를 관리하여
삭제 및 제거 하되
제거한 녀석은 스택에 넣어
최근의 순서대로 복구할 수 있도록 하는 것이 문제의 핵심이었다
(그걸 알았지만 구현은…)

Code

#include <string>
#include <vector>
#include <stack>

using namespace std;

struct Node 
{
	int val = -1;
	int prev = -1;
	int next = -1;
};

string solution(int n, int k, vector<string> cmd) {
	string answer = "";
	vector<Node> node(n);
	stack<Node> deleted;

	int idx = k;

	for (int i = 0; i < n; i++) 
	{
		answer += "O";

		node[i].val = i;

		if (i > 0) 
		{
			node[i].prev = i - 1;
		}

		if (i < n - 1) 
		{
			node[i].next = i + 1;
		}
	}

	for (int i = 0; i < cmd.size(); i++) 
	{
		string command = cmd[i];

		switch (command[0]) 
		{
		case 'U': 
		{
			int move = stoi(command.substr(2));

			while (move--) 
			{
				idx = node[idx].prev;
			}

			break;
		}

		case 'D': 
		{
			int move = stoi(command.substr(2));

			while (move--) 
			{
				idx = node[idx].next;
			}

			break;
		}

		case 'C': 
		{
			int next = node[idx].next;
			int prev = node[idx].prev;

			deleted.push(node[idx]);

			if (prev > -1) 
			{
				node[prev].next = next;
			}

			if (next > -1) 
			{
				node[next].prev = prev;
			}

			if (next == -1)
			{
				idx = prev;
			}
			else
			{
				idx = next;
			}

			break;
		}

		case 'Z': {
			Node restore = deleted.top();

			int val = restore.val;
			int next = restore.next;
			int prev = restore.prev;

			if (prev > -1) 
			{
				node[prev].next = val;
			}

			if (next > -1) 
			{
				node[next].prev = val;
			}

			deleted.pop();

			break;
		}
		}
	}

	while (deleted.empty() == false)
	{
		int top = deleted.top().val;

		deleted.pop();

		answer[top] = 'X';
	}

	return answer;
}

댓글남기기