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 |