https://school.programmers.co.kr/learn/courses/30/lessons/81303
프로그래머스
SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr

이런 문제는 간단하게 가라로 풀려고 하면 꼭 수렁에 빠지게 되네요
보면 기본적으로 제거한 행(노드)을 저장하기 위한 Stack이 필요할 것입니다.
(Z의 규칙이 마지막에 삭제된 노드 복구이기 때문에)
그리고 삭제한 노드를 복구하기 위해서는 단순히 삭제되었다고 bool등으로 체크만 한 뒤 탐색 시 이를 지나치는 방법과
아예 연결 리스트로 만들어 구현하는 방법이 있습니다.
저는 제시된 예시의 계산 횟수가 커보여서 연결리스트를 만들었습니다.
struct Node
{
Node* prev = nullptr;
Node* next = nullptr;
bool check;
int num;
};
//cmd의 각 원소는 "U X", "D X", "C", "Z" 중 하나입니다.
string solution(int n, int k, vector<string> cmd) {
string answer = "";
vector<Node*> nodes(n);
Node* prev = nullptr;
Node* next = nullptr;
Node* newNode = new Node();
newNode->prev = prev;
newNode->num = 0;
nodes[0] = newNode;
prev = newNode;
for (int i = 1; i < n; ++i)
{
Node* newNode = new Node();
newNode->prev = prev;
newNode->prev->next = newNode;
newNode->num = i;
nodes[i] = newNode;
prev = newNode;
}
Node* cur = nodes[k];
stack<Node*> removed;
for (int i = 0; i < cmd.size(); ++i)
{
if (cmd[i][0] == 'U')
{
int x = stoi(cmd[i].substr(2));
for (int j = 0; j < x; ++j)
{
cur = cur->prev;
}
}
else if (cmd[i][0] == 'D')
{
int x = stoi(cmd[i].substr(2));
for (int j = 0; j < x; ++j)
{
cur = cur->next;
}
}
else if (cmd[i][0] == 'C')
{
removed.push(cur);
if (cur->prev != nullptr)
cur->prev->next = cur->next;
if (cur->next != nullptr)
cur->next->prev = cur->prev;
if (cur->next == nullptr)
{
cur = cur->prev;
}
else
{
cur = cur->next;
}
}
else if (cmd[i][0] == 'Z')
{
Node* removedNode = removed.top();
removed.pop();
if (removedNode->prev != nullptr)
removedNode->prev->next = removedNode;
if (removedNode->next != nullptr)
removedNode->next->prev = removedNode;
}
}
vector<bool> checks(n, true);
while (!removed.empty())
{
Node* removedNode = removed.top();
removed.pop();
checks[removedNode->num] = false;
}
for (int i = 0; i < n; ++i)
{
if (checks[i])
answer += 'O';
else
answer += 'X';
}
return answer;
}
필요없는 데이터나 연산도 코딩하다보니 생겼지만 정리하지는 않았습니다.
'Algorithm > PS' 카테고리의 다른 글
| [1일 1알고] 자물쇠와 열쇠 (0) | 2026.06.04 |
|---|---|
| [1일 1알고] 인사고 (0) | 2026.06.02 |
| [1일 1알고] 모두 0으로 만들기 (0) | 2026.05.27 |
| [1일 1알고] 등대 (0) | 2026.05.26 |
| [1일 1알고] 2차원 동전 뒤집기 (0) | 2026.05.22 |