[BOJ]1406 에디터

강동현·2023년 12월 8일
0

코딩테스트

목록 보기
1/111
  • sol1: stack 2개를 이용한 포인터 처리
    포인터의 왼쪽과 오른쪽에 위치하는 문자를 저장하는 두 스택(stack list & right)을 이용해 풀이
  1. L, D, B, P에 대한 처리
  2. 스택 left의 모든 원소를 스택 right로 이동
  3. right의 모든 원소 출력
#include <iostream>
#include <string>
#include <stack>
using namespace std;
int main()
{
    int M;
    string s = "";
    stack<char> left;//left는 커서 기준 왼쪽 원소
    stack<char> right;//right는 커서 기준 오른쪽 원소
    cin >> s;
    for (int i = 0; i < (int)s.size(); i++)
        left.push(s[i]);
    cin >> M;
    for (int i = 0; i < M; i++)
    {
        char cmd, c;
        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')
        {
            cin >> c;
            left.push(c);
        }
    }
    // left에 있는 원소들 모두 right로 이동!
    while (!left.empty())
    {
        right.push(left.top());
        left.pop();
    }
    // right에 있는 원소 출력
    while (!right.empty())
    {
        cout << right.top();
        right.pop();
    }
    // 1. L, D, B, P 처리
    // 2. 왼쪽 -> 오른쪽 이동
    // 3. 출력
}
  • sol2: list를 이용한 문제 풀이
#include <iostream>
#include <string>
#include <list>
using namespace std;
int main()
{
    int M;
    string s = "";
    string ans = "";
    cin >> s;
    // 연결리스트에 원소 할당
    list<char> li(s.begin(), s.end());
    // 커서위치를 입력된 문자 제일 끝에 위치
    auto cursor = li.end();
    cin >> M;
    for (int i = 0; i < M; i++)
    {
        char cmd, c;
        cin >> cmd;
        if (cmd == 'L') if (cursor != li.begin()) cursor--;
        else if (cmd == 'D') if (cursor != li.end()) cursor++;
        else if (cmd == 'B')
        {
            if (cursor != li.begin()) // 맨 왼쪽이 아니라면
            {
                cursor--;
                cursor = li.erase(cursor); // 삭제
            }
        }
        else if (cmd == 'P')
        {
            cin >> c;
            li.insert(cursor, c); // 문자 c 삽입
        }
    }
    // 연결리스트 출력
    for (cursor = li.begin(); cursor != li.end(); cursor++)
        cout << *cursor;
}
profile
GAME DESIGN & CLIENT PROGRAMMING

0개의 댓글