http://acmicpc.net/problem/1406
{코드}
#include <iostream>
#include <string>
#include <list>
using namespace std;
int main(){
int n;
string s;
cin >> s;
cin >> n;
list<char> l(s.begin(),s.end());
auto now = l.end();
while(n--){
char tmp;
cin >> tmp;
if(tmp == 'L'){
if(now != l.begin()){
now--;
}
}
else if(tmp == 'D'){
if(now != l.end()){
now++;
}
}
else if(tmp == 'B'){
if(now != l.begin()){
now = l.erase(--now);
}
}
else if(tmp == 'P'){
char c;
cin >> c;
l.insert(now, c);
}
}
for (auto it = l.begin(); it != l.end(); it++) {
cout << *it;
}
return 0;
}
{설명}
이 문제는 스택 문제로 분류되어 있지만 그 경우 현재 커서의 위치에 따라 스택 두개를 통해 커서의 양옆에 어떤 문자가 있는지 확인하는 방식이라 리스트 자료구조를 이용해 풀기로 하였다.(시간 제한이 0.3초이기 때문에 문자열이나 배열에서 지우고 추가하는 것은 시간초과가 뜬다.)
리스트는 모든 원소가 각각 하나의 값을 가지며 다음 원소와 연결된 형태이며 이 연결을 끊는 것이 매우 간단하기 때문에 위와 같은 문제에 사용하기 효과적이다.
먼저 주어진 문자열을 리스트로 만들고 n개의 명령을 수행한다.
만약 명령이 L이면, 현재 커서가 맨 왼쪽에 있는 게 아니라면 --를 통해 한 칸 왼쪽으로 움직인다.
유사하게, 명령이 D라면 현재 커서가 맨 오른쪽에 있는 것이 아니라면 ++를 통해 한 칸 오른쪽으로 움직인다.
만약 명령이 B라면, 한 칸 왼쪽에 있는 것을 없애야 하기 때문에 맨 앞에 있는 것이 아니라면 왼쪽에 있는 것을 지운다.
명령이 P라면 문자를 추가적으로 입력받아 현재 자리에 추가한다.
이후 리스트를 처음부터 끝까지 출력한다.
'알고리즘 공부 > BOJ백준 풀이' 카테고리의 다른 글
[백준 10845번-C++] 큐 (0) | 2021.05.07 |
---|---|
[백준 1158번-C++] 요세푸스 문제 (0) | 2021.05.07 |
[백준 1874번-C++] 스택 수열 (0) | 2021.05.07 |
[백준 20191번-C++] 줄임말 (0) | 2021.05.05 |
[백준 17609번-C++] 회문 (0) | 2021.05.04 |