-
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