본문 바로가기
Baekjoon/[Code.plus] 알고리즘 기초 1/2

[BOJ/백준] 1406 에디터

by 해적거북 2021. 7. 26.
728x90

● [문제번호 1406] 에디터

 

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

 

1406번: 에디터

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

www.acmicpc.net

 

● 알아야 할 것

: list 자료구조와 메소드

: iterator 메소드

 

● 풀이 과정

: vector를 사용하면 삽입, 삭제 메소드에서 시간초과 가능성을 고려하여 list로 구현함

: 문제에서 주어지는 조건과 명령을 그대로 코드에 반영

+ 2개의 stack을 이용하여 구현 가능함 ( stack <-> 커서 <-> stack )

 

● 주의 할 것

: iterator 삭제 메소드의 반환값을 iterator가 받아야 함

 

● 참고 할 것

: (2개의 stack으로도 구현 가능) https://intaehwang.tistory.com/32

 

● 풀이 코드

#include <bits/stdc++.h>

using namespace std;

// 문자열을 저장할 list
list<char> l;
// cursor 역할
list<char>::iterator cursor;
char cmd, input;
// list에 문자열 저장하기 전에 중간 단계 (필수 아님)
string str;
int M;


int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    
    cin >> str >> M;
    
    // string -> list 로 옮기는 작업
    for(int s = 0; s < str.length(); s++)
        l.push_back(str[s]);

    // list를 지역변수로 (선언 + 초기화) 동시 작업 가능
    // list<char> l(s.begin(),s.end());

    // 커서의 초기 위치는 문자의 맨 뒤
    cursor = l.end();
    // auto now = l.end(); 로 간결히 작성 가능
    
    for(int m = 0; m < M; m++)
    {
        cin >> cmd;
        
        // 커서 왼쪽 한 칸 옮김
        if(cmd == 'L')
        {
            // 커서가 문장 맨 앞이면 무시
            if(cursor == l.begin())
                continue;
            cursor--;
        }
        // 커서 오른쪽 한 칸 옮김
        else if(cmd == 'D')
        {
            // 커서가 문장 맨 뒤이면 무시
            if(cursor == l.end())
                continue;
            cursor++;
        }
        // 커서 왼쪽 문자 삭제
        else if(cmd == 'B')
        {
            // 커서가 문장 맨 앞이면 무시
            if(cursor == l.begin())
                continue;
            cursor--;
            // 삭제하고 다음 노드를 가리키는 iterator 반환
            cursor = l.erase(cursor);
        }
        // 커서 왼쪽 문자 추가
        else if(cmd == 'P')
        {
            cin >> input;
            
            l.insert(cursor, input);
        }
    }
    
    // 완성된 문자열 출력
    for(cursor = l.begin(); cursor != l.end(); cursor++)
        cout << *cursor;
    
    
    return 0;
}

 

 

● [백준] - [알고리즘 기초 1/2] - [200 - 자료구조 1] 문제집

번호 문제 번호 문제 이름 풀이 링크
1 10828 스택 https://pirateturtle.tistory.com/153
2 9093 단어 뒤집기 https://pirateturtle.tistory.com/154
3 9012 괄호 https://pirateturtle.tistory.com/155
4 1874 스택 수열 https://pirateturtle.tistory.com/156
5 1406 에디터 https://pirateturtle.tistory.com/158
6 10845 https://pirateturtle.tistory.com/161
7 1158 요세푸스 문제 https://pirateturtle.tistory.com/162
8 10866 https://pirateturtle.tistory.com/164

 

728x90

'Baekjoon > [Code.plus] 알고리즘 기초 1/2' 카테고리의 다른 글

[BOJ/백준] 10866 덱  (0) 2021.07.26
[BOJ/백준] 1158 요세푸스 문제  (0) 2021.07.26
[BOJ/백준] 10845 큐  (0) 2021.07.26
[BOJ/백준] 1874 스택 수열  (0) 2021.07.26
[BOJ/백준] 9012 괄호  (0) 2021.07.26
[BOJ/백준] 9093 단어뒤집기  (0) 2021.07.26
[BOJ/백준] 10828 스택  (0) 2021.07.26

댓글