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 *t = 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 *p = password; while (p != NULL) { printf("%c",p->data); p = p->right; } printf("\n"); } void deleteAllNode(){ struct DOUBLE_LINK *p = 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 |