title: "[프로그래머스] 표 편집 Python 파이썬 해설 (Level 3) - 이도훈"
cleanUrl: "programmers/81303"
description: "프로그래머스 Level 3 문제 [표 편집]의 풀이를 정리합니다."

문제 설명 및 제한사항

아이디어 및 해결 방법

코드

class Node():
    def __init__(self, data):
        self.prev, self.next = None, None
        self.data = data
        self.deleted = False
    
    def append(self, node):
        self.next = node
        node.prev = self
    
    def delete(self):
        # 이 노드가 삭제되었음을 나타내고,
        self.deleted = True
		
        # 전후 노드의 연결관계를 업데이트합니다.
        if self.prev is None:
            self.next.prev = None
        elif self.next is None:
            self.prev.next = None
        else:
            prev, next = self.prev, self.next
            self.prev.next = next
            self.next.prev = prev
        
        # 마지막 노드이면, 이전 노드를 리턴합니다.
        if self.next is None:
            return self.prev
        # 그렇지 않으면, 다음 노드를 리턴합니다.
        else:
            return self.next
        
    def revert(self):
        # 복구합니다.
        self.deleted = False
        
        # 먼저 prev이 어떤 노드를 가리켜야 할지 봅시다.
        # 우선 원래 가리키던 prev을 보는데,
        prev = self.prev
        # 만약 이 prev이 역시 deleted이면
        # 그 node의 prev을 내 prev로 삼아야 합니다.
        while prev is not None and prev.deleted:
            prev = prev.prev
        self.prev = prev
        
        next = self.next
        # 만약 이 next가 역시 deleted이면
        # 그 node의 next을 내 next로 삼아야 합니다.
        while next is not None and next.deleted:
            next = next.next
        self.next = next

        # prev와 next의 연결 관계를 업데이트합니다.
        if prev is not None:
            self.prev.next = self
        if next is not None:
            self.next.prev = self
    
def solution(n, k, cmd):
    head = Node(data=-1) # head
    prev = head
    for data in range(n):
        node = Node(data=data)
        prev.append(node)
        prev = node
        
        if data == k:
            curr = node
    
    deleted_nodes = []
    for op in cmd:
        tokens = op.split()
        if tokens[0] == 'U':
            # 위로 이동합니다.
            for _ in range(int(tokens[1])):
                curr = curr.prev
        elif tokens[0] == 'D':
            # 아래로 이동합니다.
            for _ in range(int(tokens[1])):
                curr = curr.next
        elif tokens[0] == 'C':
            # 삭제합니다.
            deleted_nodes.append(curr)
            curr = curr.delete()
        elif tokens[0] == 'Z':
            node = deleted_nodes.pop()
            node.revert()
    
    answer = ['X'] * n
    curr = head
    while curr.next is not None:
        if curr.data != -1: # head는 답안에 포함시키지 않습니다.
            answer[curr.data] = 'O'
        curr = curr.next
    answer[curr.data] = 'O'
        
    return ''.join(answer)

출처

프로그래머스 코딩테스트 연습 https://school.programmers.co.kr/learn/challenges