보글보글 개발일지
article thumbnail
Published 2021. 1. 25. 17:44
[백준/5397번][C++] 키로거 알고리즘
반응형

www.acmicpc.net/problem/5397

 

5397번: 키로거

첫째 줄에 테스트 케이스의 개수가 주어진다. 각 테스트 케이스는 한줄로 이루어져 있고, 강산이가 입력한 순서대로 길이가 L인 문자열이 주어진다. (1 ≤ L의 길이 ≤ 1,000,000) 강산이가 백스페이

www.acmicpc.net

창영이.. 나쁜 친구다.

 

앞서 푼 에디터 문제와 비슷했다.

 

우선 문자열을 입력받고 변경된 문자열을 저장할 list를 선언한다.

auto cursor=l.begin()을 사용했는데, 그냥 list<char> iterator::cursor을 써도 되긴 한다.

 

'<', '>', '-' 의 경우를 뺀, 일반 문자열의 경우 그냥 list에 삽입해준다. 

l.insert(cursor,c)로 했는데, cursor가 가리키는 위치에 원소 c를 삽입한다는 말이다. 

삽입을 끝내면, 삽입한 원소를 가리키게 된다.

cursor을 처음에 begin으로 초기화 했으니까 맨 처음에 일반 문자가 있다면 그냥 l.begin()에 삽입된다.

 

-는 cursor을 앞으로 한 칸 옮기고 그 문자를 지운다. d-의 경우 d가 지워지는 것이다.

<는 맨 앞이 아닐때만 앞쪽으로 커서를 옮기고,

>는 맨 뒤가 아닐때만 뒤쪽으로 커서를 옮겨야한다.

만약... 조건을 안걸어준다면 iterator 오류가 계속 난다... 이 오류는 데구수업 2차 프젝할 때 정말 지겹도록 봤었다..

 

아무튼.. 완성된 list출력도 for문으로 해주었다.

#include <iostream>
#include <list>
using namespace std;

int main(void){
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    int n;
    cin>>n;
    for(int i=0;i<n;i++){
        string str;
        cin>>str;
        list <char> l;
        l.clear();
        auto cursor=l.begin();
        for(auto c:str){
            if(c=='-'&&cursor!=l.begin()) cursor=l.erase(--cursor);
            else if(c=='<'&&cursor!=l.begin()) cursor--;
            else if(c=='>'&&cursor!=l.end()) cursor++;
            else if(c!='<'&&c!='>'&&c!='-') l.insert(cursor,c);
        }
        for(auto i:l) cout<<i;
        cout<<"\n";
    }
    return 0;

}

 

입력화면
출력화면

반응형

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

[백준/1926번][C++] 그림  (0) 2021.01.28
[백준/10773번][C++] 제로  (0) 2021.01.25
[백준/1406번][C++] 에디터  (0) 2021.01.25
[백준/11328번][C++] Strfry  (0) 2021.01.25
[백준/1919번][C++] 에너그램 만들기  (0) 2021.01.25
profile

보글보글 개발일지

@보글

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!