https://www.acmicpc.net/problem/1406
문제 요약
에디터를 구현한다. 입력에 따라 커서를 왼쪽 오른쪽으로 움직일 수도있고, 커서의 왼쪽에 문자를 추가하거나 커서의 왼쪽의 문자를 제거하는 기능을 구현한다.
문제 해결
처음에는 cursor의 위치를 변수에 담아 기억해놓았다. 현재 입력된 문자열을 stack에 저장해놓고, 입력과 삭제가 있을 때, cursor의 위치까지 pop을 한 후, 처리를 한뒤 다식 돌려놓는 식으로 구현하였다.
하지만 이런식으로 할 경우 입력과 삭제를 할 때마다 문자열 전체에 대해 push pop연산을 하므로 문자열이 길어질 때 시간초과가 발생하는 것 같았다.
따라서 stack을 2개 쓰는 것은 비슷하지만 cursor의 위치를 따로 기억하지 않고 한쪽 stack의 top이 항상 cursor의 위치로 하여 항상 접근할 수 있게 바꾸었다.
#include <iostream>
#include <stack>
#include <string>
using namespace std;
int main(){
ios_base::sync_with_stdio(false);
cin.tie(NULL);
stack<char> current;
stack<char> temp;
string str;
getline(cin, str);
for(char c : str){
current.push(c);
}
int n;
cin >> n;
cin.get();
for(int i=0; i<n; i++){
char input[4];
cin.getline(input, 4);
char cmd = input[0];
switch (cmd)
{
case 'L':
{
if(!current.empty()){
char ch = current.top();
current.pop();
temp.push(ch);
}
break;
}
case 'D':
{
if(!temp.empty()){
char ch = temp.top();
temp.pop();
current.push(ch);
}
break;
}
case 'B':
{
if(!current.empty()){
current.pop();
}
break;
}
case 'P':
{
char ch = input[2];
current.push(ch);
break;
}
}
}
int len = current.size();
for(int i=0; i<len; i++){
char c = current.top();
temp.push(c);
current.pop();
}
int len2 = temp.size();
for(int i=0; i<len2; i++){
cout << temp.top();
temp.pop();
}
}
'Koala - 13기 > 코딩테스트 준비 스터디' 카테고리의 다른 글
[PG|Python] 프로그래머스 모두 0으로 만들기 - DFS (0) | 2024.02.15 |
---|---|
[백준/python] #11279 최대 힙 (0) | 2024.02.12 |
[백준/C++] 2343번: 기타 레슨 (0) | 2024.02.11 |
[백준/Python] 9012번: 괄호 (0) | 2024.02.10 |
[백준/C++] 1504번 특정한 최단 경로 (0) | 2024.02.10 |