더듬이의 헬로월드

Hello, World!

알고리즘 풀이/백준,BOJ [코드플러스]

[백준/자료구조 1/C++] 1406-에디터

더듬이 2021. 9. 14. 23:00
728x90

난이도

Silver3


문제집 링크

https://www.acmicpc.net/workbook/view/1406

문제 링크

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


문제 해결 과정

커서를 기준으로, 앞과 뒤 2개의 스택으로 나누어서 각 문자를 스택에 넣는다.

(커서 왼쪽 스택)  |  (커서)  |  (커서 오른쪽 스택)

커서를 왼쪽으로 옮기면 왼쪽에서 하나 빼서 오른쪽에 하나 넣는다.

커서를 오른쪽으로 옮기면 오른쪽에서 하나 빼서 왼쪽에 하나 넣는다.

지울거면 왼쪽 스택에서 하나뺀다.

추가할거면 왼쪽 스택으로 추가한다!

마지막 출력시에는 커서 전 스택을 pop하고 커서 후 스택으로 push후,

커서 후 스택을 pop하며 차례대로 출력하면 된다


주의할 점

1.만약 pop할 스택이 비어있다면, 오류가 나기 때문에 주의해서 사용해야 한다.

2.출력시, 순서에 따라 출력하므로 주의한다.


코드

#include <iostream>
#include <stack>

using namespace std;

stack<char> BOJstackA;//커서 기준 앞
stack<char> BOJstackB;//커서 기준 뒤 

void Inputdata() {
	string cmd;
	cin >> cmd;
	//문자열 입력받기

	//모든 입력은 커서 뒤 스택에 넣기
	for (int i = 0; i < cmd.length(); i++)
		BOJstackA.push(cmd[i]);
}

void Outputdata() {
	string result="";

	while (!BOJstackA.empty()){
		BOJstackB.push(BOJstackA.top());
		BOJstackA.pop();
	}

	while (!BOJstackB.empty()){
		result += BOJstackB.top();
		BOJstackB.pop();
	}
	cout << result << endl;
}
void Editor() {
	int repeat;
	cin >> repeat;

	char cmd;

	for (int i = 0; i < repeat; i++) {
		cin >> cmd;


		if (cmd == 'L' && !BOJstackA.empty()) {
			//커서가 왼쪽으로 가면, 커서 전 스택에서 pop하고, 
			//커서 후 스택으로 push
			BOJstackB.push(BOJstackA.top());
			BOJstackA.pop();
		}
		else if (cmd == 'D' && !BOJstackB.empty()) {
			//커서가 오른쪽으로 가면, 커서 후 스택에서 pop하고, 
			//커서 전 스택으로 push
			BOJstackA.push(BOJstackB.top());
			BOJstackB.pop();
		}
		else if (cmd == 'B' && !BOJstackA.empty()) {
			//커서 바로 전의 스택에서 pop!
			BOJstackA.pop();
		}
		else if(cmd=='P') {
			//입력은 왼쪽 stack에 push
			char addcmd;
			cin >> addcmd;
			BOJstackA.push(addcmd);
		}

	}
}

int main() {
	Inputdata();//데이터 입력받기

	Editor();//데이터 연산

	Outputdata();//데이터 출력하기
}


잘못된 부분이나 오해할 수 있는 부분이 있다면 언제든지 

댓글 남겨주시기 바랍니다!

728x90