티스토리 뷰

알고리즘/백준

[백준] 1406번 에디터

JeongHyeon 2017. 12. 13. 14:25

문제


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


풀이과정


스택을 사용하는 문제이지만 문제를 보고나서 스택을 사용하지 않고도 해결할 수 있을 것 같다는 생각이 들었다.

그래서 스택을 사용하지 않고 string만을 이용해서 해결해봤다.

입력은 문자열로 받았으며 N번만큼 명령어를 입력받았다.

계속해서 스택을 이용해서도 문제를 풀어봐야겠다.

처음 소스코드 이후로 커서 기준 왼쪽, 오른쪽 스택을 이용해서 풀이를 해봤다.

그리고 스택으로 풀고나니 문자열도 왼쪽 오른쪽으로 나누어서 풀어보면 어떨까 싶어서 이 문제는 총 3가지의 방법으로 풀이를 해봤다

스택을 사용한 방법이 가장 속도가 빨랐다.


소스코드


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
54
55
56
#include <iostream>
#include <string>
 
using namespace std;
 
// 문자열 풀이
int main()
{
 
    cin.sync_with_stdio(false);
    
    string str;
 
    cin >> str;
 
    int N;
    int cursor = str.length();
 
    cin >> N;
 
    string cmd;
 
    while (N--)
    {
        cin >> cmd;
 
        // 커서 왼쪽 이동
        if (cmd == "L")
        {
            if (cursor > 0) cursor--;
        }
        // 커서 오른쪽 이동
        else if (cmd == "D")
        {
            if (cursor < str.length()) cursor++;
        }
        // 문자 지우기
        else if (cmd == "B")
        {
            if (cursor > 0)
            {
                str.erase(--cursor,1);
            }
        }
        // 문자 추가
        else if (cmd == "P")
        {
            cin >> cmd;
            str.insert(cursor++, cmd);
        }
    }
 
    cout << str ;
 
    return 0;
}
cs
 
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
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
#include <iostream>
#include <string>
#include <stack>
 
using namespace std;
 
 
// 스택 사용한 풀이
 
int main()
{
    cin.sync_with_stdio(false);
 
    string str;
 
    cin >> str;
 
    int cnt;
 
    int len = str.length();
 
    stack<char> left, right;
 
    for (int i = 0; i < len; i++)
    {
        left.push(str[i]);
    }
 
    cin >> cnt;
 
    string cmd;
 
    while (cnt--)
    {
        cin >> cmd;
 
        if (cmd == "L")
        {
            if (!left.empty())
            {
                right.push(left.top());
                left.pop();
            }                
        }
        else if (cmd == "D")
        {
            if (!right.empty())
            {
                left.push(right.top());
                right.pop();
            }
        }
        else if (cmd == "B")
        {
            if(!left.empty())
                left.pop();
        }
        else if (cmd == "P")
        {
            char data;
            cin >> data;
            left.push(data);
        }
    }
 
    while (!left.empty())
    {
        right.push(left.top());
        left.pop();
    }
 
    while (!right.empty())
    {
        cout << right.top();
        right.pop();
    }
 
 
    return 0;
}
 
cs
 
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
54
55
56
57
58
59
60
61
62
#include <iostream>
#include <string>
#include <stack>
 
using namespace std;
 
// 문자열 풀이 2 (왼쪽, 오른쪽 문자열로 나누어서 풀이)
int main()
{
    cin.sync_with_stdio(false);
 
    string left,right;
 
    cin >> left;
 
    int cnt;
 
    cin >> cnt;
 
    char cmd;
 
    while (cnt--)
    {
        cin >> cmd;
 
        int left_len = left.length();
        int right_len = right.length();
 
        if (cmd == 'L')
        {
            if (left_len!=0)
            {
                right = left[left_len - 1]+right;
                left.pop_back();
            }
        }
        else if (cmd == 'D')
        {
            if (right_len!=0)
            {
                left += right[0];
                right = right.substr(1,right_len-1);
            }
        }
        else if (cmd == 'B')
        {
            if (left_len!=0)
                left.pop_back();
        }
        else if (cmd == 'P')
        {
            char data;
            cin >> data;
            left += data;
        }
    }
 
    cout << left + right;
 
 
    return 0;
}
cs
 



'알고리즘 > 백준' 카테고리의 다른 글

[백준] 1158번 조세퍼스 문제  (0) 2017.12.15
[백준] 1874번 스택 수열  (1) 2017.12.14
[백준] 10799번 쇠막대기  (0) 2017.12.12
[백준] 1152번 단어의 개수  (0) 2017.12.09
[백준] 10808번 알파벳 개수  (0) 2017.12.08
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/02   »
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
글 보관함