본문 바로가기
백준

[1406] 에디터

by kmyobin 2022. 11. 7.


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

 

1406번: 에디터

첫째 줄에는 초기에 편집기에 입력되어 있는 문자열이 주어진다. 이 문자열은 길이가 N이고, 영어 소문자로만 이루어져 있으며, 길이는 100,000을 넘지 않는다. 둘째 줄에는 입력할 명령어의 개수

www.acmicpc.net

 

스택을 이용하여 문제를 풀었다.

 

 

커서를 기준으로 왼쪽 / 오른쪽 문자들을 나누어 stack을 2개 생성하였다.

처음에는 모든 문자를 left에 담는다.(커서가 맨 뒤에 있으므로)

그 다음 명령어에 따라서 left(커서 왼쪽)에 담을지, right(커서 오른쪽)에 담을지 결정한다.

 

 

첫번째 예제의 과정을 그려보았다.

각 명령어에 따라 push, pop을 적절히 사용하였다.

그림에 있는 것만 설명하자면

P 명령어가 들어오면 left에 push, 

L 명령어가 들어오면 left.top()을 right에 push(이후에 left.pop())

을 해주었다.

 

 

여러 예제를 직접 그려보면서 명령어들의 규칙을 찾았다.

 

 

이 다음 left stack과 right stack을 어떻게 출력할 것인지도 중요하다.

left에 있는 모든 문자를 pop하여 right로 push한 다음, right에 있는 모든 문자를 pop하여 출력한다.

예제 1 : right에 모두 push한 모습

 

 

완성된 코드는 아래와 같다.

#include <iostream>
#include <stack>
#include <string>
using namespace std;

// L : 커서 왼 쪽으로
// D : 커서 오른쪽으로
// B : 커서 왼쪽에 있는 문자 삭제
// P $ : $를 커서 왼쪽에 추가

stack<char> l;
stack<char> r;

string input;
int M;
string C;

int main() {
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);

	// 입력
	cin >> input;
	for (int i = 0; i < input.length(); i++)
	{
		l.push(input[i]);
	}

	// 명령어 실행
	cin >> M;
	cin.ignore(); // cin으로 입력받은 이후 getline을 사용하면 '\n'때문에 무시되는 경우 발생
	for (int i = 0; i < M; i++)
	{
		getline(cin, C);
		if (C[0] == 'P') { // 커서 왼쪽에 문자 넣음

			l.push(C[2]);
		}
		else if (C[0] == 'L') { // 커서 왼쪽으로 이동
			if (l.empty()) {}
			else {
				r.push(l.top());
				l.pop();
			}
		}
		else if (C[0] == 'D') { // 커서 오른쪽으로 이동
			if (r.empty()) {}
			else {
				l.push(r.top());
				r.pop();
			}
		}
		else { // 커서 왼쪽에 있는 문자 삭제
			if (l.empty()) {}
			else { l.pop(); }
		}
	}

	while (!l.empty()) { // 커서 왼쪽에 있는 문자들 오른쪽으로 옮김
		r.push(l.top());
		l.pop();
	}

	while (!r.empty()) { // 답 출력
		printf("%c", r.top());
		r.pop();
	}
}

cin 다음에 getline 함수를 쓰면 '\n'때문에 입력이 되지 않는 문제가 발생한다.

그래서 cin.ignore()을 작성해줌으로서 해결하였다.

 

자세한 설명은 아래의 블로그에 나와있다.

https://cryptosalamander.tistory.com/136

 

[C++ / STL] String 공백 포함 입력 받는 방법

String 공백 포함 입력 받는 방법 string과 char[] 자료형 모두 공백이 포함된 입력을 받았을 때, 공백을 기준으로 다른 인자라고 판단하여, 공백 문자가 나오기 이전까지의 문자들만 입력이 되는 문

cryptosalamander.tistory.com

 

'백준' 카테고리의 다른 글

[1074] Z  (0) 2022.11.12
[2630] 색종이 만들기  (0) 2022.11.08
[1158] 요세푸스 문제  (0) 2022.11.06
[10866] 덱  (0) 2022.11.04
[10845] 큐  (0) 2022.11.03

댓글