본문 바로가기
알고리즘

카카오 인턴십 표 편집 (Python)

by PudgeKim 2021. 8. 21.

처음에 잘 못풀어서 카카오 풀이를 보고 풀었던 문제로 효율성 테스트까지 통과하려면 연결 리스트를 사용해서 풀어야하는 문제입니다.

그런데 연결리스트로 구현하는걸 알더라도 각 노드의 prev와 next가 None일 때 에러가 나는걸 처음에 고려하지 않은채 풀어서 푸는데 꽤 시간이 걸렸습니다.

1
2
3
// 아래와 같은 코드를 작성할 때
// node.prev가 None이라면 에러가 납니다.
node.prev.next = None
cs

 

Python 코드입니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
class Node:
    def __init__(self, num):
        self.num = num
        self.prev = None
        self.next = None
    
    
def make_table(n):
    prev_node = None
    root_node = None
    for i in range(n):
        if i == 0:
            node = Node(i)
            root_node = node
            prev_node = node
        else:
            node = Node(i)
            prev_node.next = node
            node.prev = prev_node
            prev_node = node
    
    return root_node
 
def make_map(n):
    answer_map = dict()
    for i in range(n):
        answer_map[i] = 'O'
    return answer_map
        
def get_start(k, root_node):
    for i in range(k):
        root_node = root_node.next
    return root_node
 
def move_up(n, node):
    for i in range(n):
        node = node.prev
    return node
 
def move_down(n, node):
    for i in range(n):
        node = node.next
    return node
 
def delete(node):
    if node.next is None# 현재 행이 마지막 행인 경우
        node = node.prev
        if node is not None and node.next is not None:
            node.next = None
    else:
        if node.prev is not None:
            node.prev.next = node.next # 이전 행의 next 바꾸기
        node.next.prev = node.prev # 다음 행의 prev 바꾸기
        node = node.next
    return node
 
def restore(del_node):
    prev_node = del_node.prev
    next_node = del_node.next
    if prev_node is not None:
        prev_node.next = del_node
    if next_node is not None:
        next_node.prev = del_node
 
def solution(n, k, cmds):
    root_node = make_table(n)
    node = get_start(k, root_node)
    answer_map = make_map(n)
    deleted = []
    
    for cmd in cmds:
        if cmd[0== 'U':
            step = int(cmd[2:])
            node = move_up(step, node)
        elif cmd[0== 'D':
            step = int(cmd[2:])
            node = move_down(step, node)
        elif cmd[0== 'C':
            deleted.append(node)
            answer_map[node.num] = 'X'
            node = delete(node)
        elif cmd[0== 'Z':
            del_node = deleted.pop()
            answer_map[del_node.num] = 'O'
            restore(del_node)
    
    
    answer = ''.join(answer_map.values())
    return answer
cs

'알고리즘' 카테고리의 다른 글

백준 14467번 Rust 풀이  (0) 2021.10.10
백준 1913번 달팽이 Rust 풀이  (0) 2021.10.10
백준 사회망 서비스(Python/Go)  (0) 2021.04.15
백준 단지번호 붙이기(Go)  (0) 2021.04.11
백준 아기상어 (Go)  (0) 2021.04.07