본문 바로가기

백준

5397)키로거

https://www.acmicpc.net/problem/5397


문제를 이해하기 위해 메모장을 열어서 확인해보자.


키로거가 ab<<bcd를 기록했다고 해보자


ab를 입력하고 커서가 앞쪽으로 두 번 이동한다.


그리고 bcd가 입력되므로 bcdab를 입력한 것이다.


삽입과 삭제가 쉬워야 하니 이중 연결 리스트를 사용하는 것이 좋을 것같다.


<를 읽으면 이중 연결리스트의 어떤 노드를 가리켰던 커서가 왼쪽 노드를 가리키게 하고


>를 읽으면 커서가 가리키는 노드에서 오른쪽 노드를 가리키게 한다. 


-를 읽으면 커서가 가리키는 노드를 삭제한다.


이중 연결 리스트의 연산의 삽입과 삭제 연산을 구현해야 한다.


계속 틀려서 테스트 케이스를 뜯어보고 예외 처리를 한지라 코드가 굉장히 지저분하다.


(이 문제의 해답은 스택을 사용함)


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
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
#include<stdio.h>
#define LENGTH 1000010
 
struct DOUBLE_LINK{
    struct DOUBLE_LINK *left;
    char data;
    struct DOUBLE_LINK *right;
};
 
struct DOUBLE_LINK *password = NULL;
struct DOUBLE_LINK *= NULL;
 
void createNode(char c) {
    struct DOUBLE_LINK *oldNode;
    oldNode = (struct DOUBLE_LINK *)malloc(sizeof(struct DOUBLE_LINK));
    
    oldNode->left = NULL;
    oldNode->data = c;
    oldNode->right = NULL;
    
    if (t == NULL && password == NULL) {
        password = oldNode;
        t = password;
    }
    else if(t == NULL && password != NULL){
            oldNode->right = password;
            password->left = oldNode;
 
            password = oldNode;
            t = password;
    }
    else if (t->right != NULL) {
        oldNode->right = t->right;
        t->right->left = oldNode;
 
        oldNode->left = t;
        t->right = oldNode;
        t = t->right;
    }
    else if (t->right == NULL) {
        oldNode->left = t;
        t->right = oldNode;
        t = t->right;
    }
}
 
void showData() {
    struct DOUBLE_LINK *= password;
 
    while (p != NULL) {
        printf("%c",p->data);
        p = p->right;
    }
    printf("\n");
}
 
void deleteAllNode(){
    struct DOUBLE_LINK *= password;
    struct DOUBLE_LINK *q;
 
    while (p != NULL) {
        q = p;
        p = p->right;
        free(q);
    }
 
    password = NULL;
    t = password;
}
 
void deleteNode() {
    if (t != NULL) {
        struct DOUBLE_LINK *oldNode;
        oldNode = t;
 
        if (t->right == NULL) {
            if (password != t) {
                t->left->right = NULL;
                t = t->left;
            }
            else {
                password = NULL;
                t = password;
            }
        }
        else if (t->left == NULL) {
            password = password->right;
            password->left = NULL;
            t = t->left;
        }
        else {
            t->left->right = t->right;
            t->right->left = t->left;
            t = t->left;
        }
 
        free(oldNode);
    }
}
 
void excute(char c) {
    switch (c)
    {
    case '<':
        if (t != NULL) {
            t = t->left;
        }
        break;
    case '>':
        if (t != NULL) {
            if(t->right != NULL) t = t->right;
        }
        else {
            if (password != NULL) t = password;
        }
        break;
    case '-':
        deleteNode();
        break;
    }
}
 
int main() {
    int N;
    char L[LENGTH];
 
    scanf("%d",&N);
    for (int i = 0; i < N;i++) {
        scanf("%s",L);
        for (int j = 0; L[j] != NULL;j++) {
            if (L[j]!='<'&&L[j] != '>'&&L[j] != '-') {
                createNode(L[j]);
            }
            else {
                excute(L[j]);
            }
        }
        showData();
        deleteAllNode();
    }
 
    system("pause");
    return 0;
}
cs


'백준' 카테고리의 다른 글

2799)블라인드  (0) 2019.01.31
2822)점수 계산  (0) 2019.01.31
2846)오르막길  (0) 2019.01.30
1929)소수 구하기  (0) 2019.01.24
9020)골드바흐의 추측  (0) 2019.01.23