반응형
1406번: 에디터
첫째 줄에는 초기에 편집기에 입력되어 있는 문자열이 주어진다. 이 문자열은 길이가 N이고, 영어 소문자로만 이루어져 있으며, 길이는 100,000을 넘지 않는다. 둘째 줄에는 입력할 명령어의 개수
www.acmicpc.net
문자열을 list에 저장한다. auto형으로 cursor변수를 선언해 커서의 위치를 맨 뒤로 보낸다.
명령어를 입력받아 각 명령어에 따라 명령을 수행한다.
L: 커서를 왼쪽으로 한 칸 옮김 (커서가 문장의 맨 앞이면 무시됨) |
D: 커서를 오른쪽으로 한 칸 옮김 (커서가 문장의 맨 뒤이면 무시됨) |
B:커서 왼쪽에 있는 문자를 삭제함 (커서가 문장의 맨 앞이면 무시됨) 삭제로 인해 커서는 한 칸 왼쪽으로 이동한 것처럼 나타나지만, 실제로 커서의 오른쪽에 있던 문자는 그대로임 |
P: $라는 문자를 커서 왼쪽에 추가함 |
위 표를 보면, L,D,B의 경우 무시되는 경우가 있다.
커서가 맨 앞인 경우, if(cursor!=l.begin())으로 명령어를 무시해줘야한다.
커서가 맨 뒤인 경우, if(cursor!=l.end())으로 명령어를 무시해줘야한다.
list만 좀 활용하면 된다.
#include<iostream>
#include<list>
using namespace std;
int main(void)
{
ios_base::sync_with_stdio;
cin.tie(0);
/*문자열 입력받음*/
string str;
cin>>str;
/*입력받은 문자열 list에 저장*/
list <char> l;
for(auto c:str)
l.push_back(c);
auto cursor=l.end();//커서의 위치를 맨 뒤로 보낸다.
int num;
cin>>num;
for(int i=0; i<num;i++)
{
//명령어 입력받기
char op;
cin>>op;
if(op=='L')
{
if(cursor!=l.begin())
cursor--;
}
else if(op=='D')
{
if(cursor!=l.end())
cursor++;
}
else if(op=='B')
{
if(cursor!=l.begin())
{
cursor--;
cursor=l.erase(cursor);
}
}
else
{
char c;
cin>>c;
l.insert(cursor,c);
}
}
for(auto i:l) cout<<i;
return 0;
}
반응형
'알고리즘' 카테고리의 다른 글
[백준/10773번][C++] 제로 (0) | 2021.01.25 |
---|---|
[백준/5397번][C++] 키로거 (0) | 2021.01.25 |
[백준/11328번][C++] Strfry (0) | 2021.01.25 |
[백준/1919번][C++] 에너그램 만들기 (0) | 2021.01.25 |
[백준/10171번][C++] 고양이 (0) | 2021.01.25 |