ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • BOJ 1406 : 에디터
    백준 문제풀이/etc 2020. 6. 5. 12:31

    문제


     

    문제 풀어보기

     

     

    풀이


     

    사실 String 으로도 엄청 간단하게 구현이 가능합니다.

    그런데 삽입,삭제가 너무 많아서 시간 초과가 나네요.

    그래서 삽입,삭제가 유용한 리스트를 사용합니다.

     

     

    대부분 벡터랑 비슷한데 리스트는 Iterator 를 기반으로 움직입니다.

    그래서 삭제하는 과정에서 해당 cursor 위치의 노드를 삭제하면

    그다음 Iterator 의 정보를 받아와야 합니다.

     

    cursor = list.erase(cursor)

     

    이런 느낌이 되겠죠.

    erase 는 삭제 후 다음 노드의 Iterator를 반환해줍니다.

     

     

    코드


    #include <iostream>
    #include <vector>
    #include <queue>
    #include <algorithm>
    #include <list>
    
    
    using namespace std;
    #define safe(x,y) x>=8 || x<0 || y<0 || y>=8
    
    int dx[] = { -1, 0, 1, 0 };
    int dy[] = { 0, 1, 0 , -1 };
    //위 오른쪽 아래 왼쪽
    
    //int dx[] = { -1, 1, 1, -1 };
    //int dy[] = { 1, 1, -1 , -1 };
    // 대각선
    
    string s;
    int n;
    
    
    int main() {
    	ios::sync_with_stdio(false);
    	cin.tie(NULL);
    
    	cin >> s >> n;
    	list<char> cl;
    	for (int i = 0; i < s.length(); i++) {
    		cl.push_back(s[i]);
    	}
    	list<char> ::iterator cur = cl.end();
    
    	char c;
    	for (int i = 0; i < n; i++) {
    
    		cin >> c;
    		if (c == 'L') {
    			if (cur != cl.begin()) cur--;
    		}
    		else if (c == 'D') {
    			if (cur != cl.end()) cur++;
    		}
    		else if (c == 'P') {
    			char plus;
    			cin >> plus;
    			cl.insert(cur, plus);
    		}
    		else if (c == 'B') {
    			if (cur == cl.begin()) continue;
    			cur = cl.erase(--cur);
    			// 삭제후 다음 원소 이터 반환
    		}
    	}
    
    	for (auto it = cl.begin(); it != cl.end(); it++) {
    		cout << *it;
    	}
    	cout << '\n';
    
    	return 0;
    }

     

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

    BOJ 10828 : 스택  (0) 2020.07.09
    SWEA 4013 : [모의 SW 역량테스트] 특이한 자석  (0) 2020.06.06
    BOJ 9663 : N-Queen  (0) 2020.05.19
    BOJ 17140 : 이차원 배열과 연산  (0) 2020.05.10
    BOJ 17143 : 낚시왕  (0) 2020.05.04

    댓글

Designed by Tistory.