Problem D : 키로거(Keylogger)
제한시간: 1000 ms 메모리제한: 128 MB
심술쟁이 해커 덕표는 미스터 부의 패스워드를 해킹하려고 한다.
그래서 덕표는 미스터 부의 컴퓨터에 키로거를 설치했다.
며칠 후 덕표는 미스터 부의 로그파일을 입수했다.
그런데 로그파일을 본 덕표는 패스워드가 어떻게 되는지 바로 알 수는 없었다.
미스터부가 패스워드가 잘 생각나지 않았는지 방향키를 이용하여 좌우로 이동하면서
문자를 삽입하거나 백스페이스를 이용하여 문자를 삭제한 흔적이 발견되었기 때문이다.
성질이 급한 덕표는 이를 해결하기 위해 종민이에게 부탁하였다.
로그 파일을 받은 종민이는 패스워드를 찾을 수 있을까?
첫 행에 테스트 케이스 수 T ( 1<= T <=5)가 입력된다. 다음 T개의 행에 각각의 패스워드 로그가 입력된다. 각 로그에는 숫자와 영문자 그리고 ‘-’, ‘<’, ‘>’로 구성된 L(1<=L<=1,000,000)길이의 문자열이 주어진다. 키보드의 입력상태는 삽입모드라고 가정한다. ‘-’는 백스페이스를 이용하여 삭제가 가능하다면 커서의 바로 앞 1문자를 삭제한 로그이다. ‘<’는 왼쪽 방향키를 이용하여 이동이 가능하다면 커서 바로 왼쪽 1문자 앞으로 이동한 로그이다. ‘>’는 오른쪽 방향키를 이용하여 이동이 가능하다면 커서 바로 오른쪽 1문자 뒤로 이동한 로그이다.
각 테스트 케이스에 대하여 행으로 구분하여 미스터 부의 패스워드를 출력한다. 각 테스트 케이스에 대한 미스터 부의 패스워드의 길이는 1개 이상이다.
2
<<BP>Cd-
ThIsIsS3Cr3t
BAPC
ThIsIsS3Cr3t
#include <stdio.h>
#define MAX 10
char st[MAX];
struct data{
char ch;
data *prev, *next;
data *myAlloc(char _ch, data *_prev, data *_next) {
ch = _ch, prev = _prev, next = _next;
return this;
}
void pop()
{
prev->next = next;
next->prev = prev;
}
} *head, *tail, *cur, buf[MAX];
int bn;
void push(char ch)
{
data *pr = cur->prev;
pr->next = cur->prev = buf[bn++].myAlloc(ch, pr, cur);
}
int main()
{
freopen("input.txt", "r", stdin);
int T;
scanf("%d", &T);
head = buf[0].myAlloc(0, 0, 0);
tail = buf[1].myAlloc(0, 0, 0);
while (T--){
bn = 2;
head->next = tail;
tail->prev = head;
cur = tail;
scanf("%s", st);
for (int i = 0; st[i]; i++){
switch (st[i]){
case '<':
if (cur->prev != head) cur = cur->prev;
break;
case '>' :
if (cur != tail) cur = cur->next;
break;
case '-':
if (cur->prev != head) cur->prev->pop();
break;
default:
push(st[i]);
}
}
for (data *p = head->next; p != tail; p = p->next) printf("%c", p->ch);
printf("\n");
}
}
'Computer Science' 카테고리의 다른 글
Problem F : 합이 0이 되는 4개의 숫자들 (0) | 2020.01.08 |
---|---|
Problem E : 구간 성분 (0) | 2020.01.08 |
Problem C : 용액 (0) | 2020.01.08 |
Problem B : const구간의 합 구하기(2D) (0) | 2020.01.07 |
Problem A : 수열 (0) | 2020.01.07 |
댓글