-
[백준] 1406 에디터Problem Solving/Baekjoon Online Judge 2020. 4. 16. 20:57
✔️ 문제 링크
https://www.acmicpc.net/problem/1406
✔️ 문제 이해
1. 주어진 문자열에 대해 커서 관련 명령어를 수행한 결과를 출력한다.
✔️ 설계
1. 이 문제는 스택을 활용하는 문제이다.
2. 커서 왼쪽에 있는 문자들을 담는 스택 L 과 커서 오른쪽에 있는 문자들을 담는 스택 R 두 개의 스택을 사용한다.
3. L : 커서를 왼쪽으로 한 칸 옮기므로, L에서 원소를 하나 꺼내서 R에 넣는다.
4. R : 커서를 오른쪽으로 한 칸 옮기므로, R에서 원소를 하나 꺼내서 L에 넣는다.
5. B : 커서 왼쪽에 있는 문자를 삭제한다. L에서 원소를 하나 삭제하면 된다.
6. P $ : $라는 문자를 커서 왼쪽에 추가한다. L에 원소를 하나 추가한다.
✔️ 문제 회고
1. 두 개의 스택을 활용해서 문제 조건대로 구현하면 된다.
2. L 스택의 원소를 pop해서 R 스택에 쌓고, R스택을 pop하며 순차적으로 꺼내서 출력하면 올바른 순서로 문자들이 출력된다. (그림을 그려서 이해하면 편하다.)
👨🏻💻 소스 코드
#include<iostream> #include<string> #include<stack> using namespace std; stack<char> l, r; int main() { string s; cin >> s; //초기 커서위치는 문장의 맨 뒤이므로 l 스택에 모든 문자열을 넣는다. for (int i = 0; i < s.size(); i++) { l.push(s[i]); } int m; cin >> m; char op; while (m--) { cin >> op; if (op == 'L' && !l.empty()) { r.push(l.top()); l.pop(); } else if (op == 'D' && !r.empty()) { l.push(r.top()); r.pop(); } else if (op == 'B' && !l.empty()) { l.pop(); } else if (op == 'P') { char ch; cin >> ch; l.push(ch); } } while (!l.empty()) { //l스택의 원소들을 r스택에 넣어주어 결과를 만든다. r.push(l.top()); l.pop(); } while (!r.empty()) {//결과 출력 top부터 출력 하면된다. (l에서 r로 넘어왔기 때문에 순서가 올바르다.) cout << r.top(); r.pop(); } return 0; }
'Problem Solving > Baekjoon Online Judge' 카테고리의 다른 글
[백준] 11723 집합 (0) 2020.04.29 [백준] 14391 종이조각 (0) 2020.04.20 [백준] 3980 선발명단 (0) 2020.04.16 [백준] 1806 부분합 (0) 2020.04.16 [백준] 1038 감소하는 수 (0) 2020.04.15