백준 #1406 에디터 c++
2021. 5. 2. 23:44ㆍ백준 문제풀이
반응형
백준 1406번 에디터 문제이다. 레벨은 실버3.
일단 분류가 알고리즘상 스택으로 분류가 되어있다.
하지만 스택으로 풀면 조금 귀찮은 부분이 없지 않고, 리스트로 풀면 가장 간단한데,
그 이유인 즉, 스택은 인덱스 수정을 하려면 그 과정이 복잡하지만
리스트는 중간 삽입이 손쉽게 가능하기 때문이다.
//list.insert(iter, k);
//list.erase(iter);
리스트의 경우 위와 같은 코드를 활용해서 P $ 와 D 명령어를 쉽게 구현할 수 있다.
스택으로 구현하는 방법을 생각해보자.
스택은 특성상, Push를 할 경우 가장 위쪽에 추가가 되고, pop을 해도 가장 위쪽 값이 사라지며
값 반환 역시 가장 위에 있는 값 밖에 되지 않는다.
그렇기 때문에 기존의 스택 말고, 다른 스택을 정의해서 커서를 옮겨갈 때마다 임시 스택에 푸시하는 방법을 쓴다.
아래는 c++을 사용한 코드 전문이다.
#include <iostream>
#include <stack>
#include <string>
using namespace std;
// L 이 들어오면 기존 스택에서 예비 스택으로 top을 옮김 ->기존스택이 empty인지 아닌지 검사
// D 가 들어오면 예비스택에서 기존스택으로 옮김 -> 예비 스택이 empty인지 아닌지 검사
// B 가 들어오면 기존 스택 pop; -> 기존 스택이 empty 이면 무시 -> 예비 스택은 그대로 있음
// P $ 가 들어오면 push 함.
//
//
//
//
string str;
stack<char> st;
stack<char> temp;
int main() {
cin >> str;
int n;
for(int i = 0; i < str.length(); i++) {
st.push(str[i]);
}
cin >> n;
while(n--) {
char command;
cin >> command;
if(command == 'P') {
char c;
cin >> c;
st.push(c);
}
else if(command == 'L') {
if(st.empty())
continue;
else {
temp.push(st.top());
st.pop();
}
}
else if(command == 'B') {
if(st.empty()){
continue;
}
else {
st.pop();
}
}
else if(command == 'D') {
if(temp.empty()) continue;
else {
st.push(temp.top());
temp.pop();
}
}
}
while(!st.empty()) {
temp.push(st.top());
st.pop();
}
while(!temp.empty()) {
cout << temp.top();
temp.pop();
}
return 0;
}
마지막에는 임시배열에 푸시를 하면 역순으로 저장되고
다시 pop을 하면서 출력하면 원래 순서대로 출력된다.
반응형
'백준 문제풀이' 카테고리의 다른 글
백준 #2675 문자열 반복 c, python (0) | 2021.05.10 |
---|---|
백준 #1158 요세푸스 문제 c++ (0) | 2021.05.03 |
백준 #9012번 괄호 c++ (0) | 2021.05.01 |
백준 #9093 단어 뒤집기 C++ (0) | 2021.05.01 |
백준 #10828 스택 c++ (0) | 2021.04.30 |