본문 바로가기
백준

[백준 1406] 에디터, C++

by 황인태(intaehwang) 2020. 1. 8.
반응형

https://www.acmicpc.net/problem/1406

 

1406번: 에디터

문제 한 줄로 된 간단한 에디터를 구현하려고 한다. 이 편집기는 영어 소문자만을 기록할 수 있는 편집기로, 최대 600,000글자까지 입력할 수 있다. 이 편집기에는 '커서'라는 것이 있는데, 커서는 문장의 맨 앞(첫 번째 문자의 왼쪽), 문장의 맨 뒤(마지막 문자의 오른쪽), 또는 문장 중간 임의의 곳(모든 연속된 두 문자 사이)에 위치할 수 있다. 즉 길이가 L인 문자열이 현재 편집기에 입력되어 있으면, 커서가 위치할 수 있는 곳은 L+1가지 경우가

www.acmicpc.net

 본 문제는 2004 Olympiad Croatian Highschool Competitions in Informatics National Competition #1 - Juniors 2번 문제다. 이 문제는 코드 플러스 알고리즘 기초 1/2 - 자료구조 1에 있는 문제다. (처음 이 문제를 접했을 때, C++ STL이 익숙하지 않아 못 풀었다. 내가 기초가 많이 부족하다고 느꼈던 여러 문제들 중 하나다.) 보통 list 또는 linked list로 접근할 것이다. 하지만 stack으로 문제를 해결 할 수 있다. (??? : 많은 사람들이 어떻게 stack으로 풀 생각을 했냐고 물어보는데 나도 stack으로 풀 생각을 못했다. 답을 찾아보고 알았다. - 2020. 01. 백준 오프라인 강의 중)

  1. 커서를 기준으로 왼쪽 stack, 오른쪽 stack을 선언한다.
  2. 문제 조건을 만족하면서, P일 경우 왼쪽 stack에 push
  3. L일 경우, 왼쪽 stack top을 오른쪽 stack으로 push
  4. R일 경우, 오른쪽 stack top을 왼쪽 stack으로 push
  5. D일 경우, 왼쪽 stack top을 pop
  6. 출력할 땐, 왼쪽 stack 전체를 오른쪽으로 push
  7. 오른쪽 stack 전체를 pop하면서 출력

stack 소스 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
#include <iostream>
#include <stack>
#include <string>
 
using namespace std;
 
int main() {
    string s = "";
    cin >> s;
    stack<char> l;
    stack<char> r;
    for (int i = 0; i < s.size(); i++) {
        l.push(s[i]);
    }
    int num;
    cin >> num;
    while (num--) {
        char tmp;
        cin >> tmp;
        if (tmp == 'P') {
            char c;
            cin >> c;
            l.push(c);
        }
        else if (tmp == 'L') {
            if (l.empty()) continue;
            else {
                r.push(l.top());
                l.pop();
            }
        }
        else if (tmp == 'B') {
            if (l.empty()) continue;
            else l.pop();
        }
        else if (tmp == 'D') {
            if (r.empty()) continue;
            else {
                l.push(r.top());
                r.pop();
            }
        }
    }
    while (!l.empty()) {
        r.push(l.top());
        l.pop();
    }
    while (!r.empty()) {
        cout << r.top();
        r.pop();
    }
    return 0;
}
cs

 

list 소스 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#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;     
}
cs
반응형

'백준' 카테고리의 다른 글

[백준 4375] 1, C++  (0) 2020.01.08
[백준 1158] 요세푸스 문제, C++  (0) 2020.01.08
[백준 1874] 스택 수열, C++  (0) 2020.01.08
[백준 9012] 괄호, C++  (0) 2020.01.08
[백준 9093] 단어 뒤집기, C++  (0) 2020.01.08
Buy me a coffeeBuy me a coffee

댓글