
https://www.acmicpc.net/problem/1406
1406번: 에디터
첫째 줄에는 초기에 편집기에 입력되어 있는 문자열이 주어진다. 이 문자열은 길이가 N이고, 영어 소문자로만 이루어져 있으며, 길이는 100,000을 넘지 않는다. 둘째 줄에는 입력할 명령어의 개수
www.acmicpc.net
스택을 이용하여 문제를 풀었다.
커서를 기준으로 왼쪽 / 오른쪽 문자들을 나누어 stack을 2개 생성하였다.
처음에는 모든 문자를 left에 담는다.(커서가 맨 뒤에 있으므로)
그 다음 명령어에 따라서 left(커서 왼쪽)에 담을지, right(커서 오른쪽)에 담을지 결정한다.
첫번째 예제의 과정을 그려보았다.
각 명령어에 따라 push, pop을 적절히 사용하였다.
그림에 있는 것만 설명하자면
P 명령어가 들어오면 left에 push,
L 명령어가 들어오면 left.top()을 right에 push(이후에 left.pop())
을 해주었다.
여러 예제를 직접 그려보면서 명령어들의 규칙을 찾았다.

이 다음 left stack과 right stack을 어떻게 출력할 것인지도 중요하다.
left에 있는 모든 문자를 pop하여 right로 push한 다음, right에 있는 모든 문자를 pop하여 출력한다.

완성된 코드는 아래와 같다.
#include <iostream>
#include <stack>
#include <string>
using namespace std;
// L : 커서 왼 쪽으로
// D : 커서 오른쪽으로
// B : 커서 왼쪽에 있는 문자 삭제
// P $ : $를 커서 왼쪽에 추가
stack<char> l;
stack<char> r;
string input;
int M;
string C;
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
// 입력
cin >> input;
for (int i = 0; i < input.length(); i++)
{
l.push(input[i]);
}
// 명령어 실행
cin >> M;
cin.ignore(); // cin으로 입력받은 이후 getline을 사용하면 '\n'때문에 무시되는 경우 발생
for (int i = 0; i < M; i++)
{
getline(cin, C);
if (C[0] == 'P') { // 커서 왼쪽에 문자 넣음
l.push(C[2]);
}
else if (C[0] == 'L') { // 커서 왼쪽으로 이동
if (l.empty()) {}
else {
r.push(l.top());
l.pop();
}
}
else if (C[0] == 'D') { // 커서 오른쪽으로 이동
if (r.empty()) {}
else {
l.push(r.top());
r.pop();
}
}
else { // 커서 왼쪽에 있는 문자 삭제
if (l.empty()) {}
else { l.pop(); }
}
}
while (!l.empty()) { // 커서 왼쪽에 있는 문자들 오른쪽으로 옮김
r.push(l.top());
l.pop();
}
while (!r.empty()) { // 답 출력
printf("%c", r.top());
r.pop();
}
}
cin 다음에 getline 함수를 쓰면 '\n'때문에 입력이 되지 않는 문제가 발생한다.
그래서 cin.ignore()을 작성해줌으로서 해결하였다.
자세한 설명은 아래의 블로그에 나와있다.
https://cryptosalamander.tistory.com/136
[C++ / STL] String 공백 포함 입력 받는 방법
String 공백 포함 입력 받는 방법 string과 char[] 자료형 모두 공백이 포함된 입력을 받았을 때, 공백을 기준으로 다른 인자라고 판단하여, 공백 문자가 나오기 이전까지의 문자들만 입력이 되는 문
cryptosalamander.tistory.com

'백준' 카테고리의 다른 글
[1074] Z (0) | 2022.11.12 |
---|---|
[2630] 색종이 만들기 (0) | 2022.11.08 |
[1158] 요세푸스 문제 (0) | 2022.11.06 |
[10866] 덱 (0) | 2022.11.04 |
[10845] 큐 (0) | 2022.11.03 |
댓글