본문 바로가기
알고리즘 문제풀이/백준

[백준 1406] 에디터

by m2162003 2020. 11. 29.

www.acmicpc.net/problem/1406

 

1406번: 에디터

첫째 줄에는 초기에 편집기에 입력되어 있는 문자열이 주어진다. 이 문자열은 길이가 N이고, 영어 소문자로만 이루어져 있으며, 길이는 100,000을 넘지 않는다. 둘째 줄에는 입력할 명령어의 개수

www.acmicpc.net

연결리스트, 스택, 덱을 이용해서 풀 수 있다.

 

1. 스택 이용

두 개의 스택을 이용한다.

커서의 왼쪽에 있는 문자열을 s1 스택에 저장. 커서의 오른쪽에 있는 문자열은 s2스택에 저장한다.

 

명령어 L과 D의 경우 커서가 움직일 때마다 문자열을 옮긴다.

#include <iostream>
#include <string>
#include <stack>
using namespace std;

stack<char> s1, s2;
int main(void)
{
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);

  string str;
  cin >> str;

  int n;
  cin >> n;

  for (auto &x : str)
  {
    s1.push(x);
  }

  while (n--)
  {
    char cmd;
    cin >> cmd;
    if (cmd == 'L')
    {
      if (!s1.empty())
      {
        s2.push(s1.top());
        s1.pop();
      }
    }
    else if (cmd == 'D')
    {
      if (!s2.empty())
      {
        s1.push(s2.top());
        s2.pop();
      }
    }
    else if (cmd == 'B')
    {
      if (!s1.empty())
      {
        s1.pop();
      }
    }
    else if (cmd == 'P')
    {
      char tmp;
      cin >> tmp;
      s1.push(tmp);
    }
  }

  while (!s1.empty())
  {
    s2.push(s1.top());
    s1.pop();
  }

  while (!s2.empty())
  {
    cout << s2.top();
    s2.pop();
  }

  return 0;
}

 

2. 연결리스트 

list stl을 사용한다. double linked list와 동일하다.

 

#include <iostream>
#include <list>
#include <string>

using namespace std;

int n;
string str;

int main(void)
{
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);

  cin >> str;

  cin >> n;
  list<char> lt(str.begin(), str.end());
  auto cursor = lt.end();

  for (int i = 0; i < n; i++)
  {
    char cmd;
    cin >> cmd;
    if (cmd == 'L')
    {
      if (cursor != lt.begin())
      {
        cursor--;
      }
    }
    else if (cmd == 'D')
    {
      if (cursor != lt.end())
      {
        cursor++;
      }
    }
    else if (cmd == 'B')
    {
      if (cursor != lt.begin())
      {
        cursor--;
        cursor = lt.erase(cursor);
      }
    }
    else if (cmd == 'P')
    {
      char tmp;
      cin >> tmp;

      lt.insert(cursor, tmp);
    }
  }

  for (char x : lt)
  {
    cout << x;
  }

  return 0;
}

'알고리즘 문제풀이 > 백준' 카테고리의 다른 글

[백준 4889] 안정적인 문자열  (0) 2020.11.29
[백준 5397] 키로거  (0) 2020.11.29
[백준 10814] 나이순 정렬  (0) 2020.11.28
[백준 1181] 단어 정렬  (0) 2020.11.28
[백준 7785] 회사에 있는 사람  (0) 2020.11.28

댓글