※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※

 

이번에 볼 문제는 백준 5397번 문제인 키로거이다.
문제는 아래 링크를 확인하자.

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

 

5397번: 키로거

첫째 줄에 테스트 케이스의 개수가 주어진다. 각 테스트 케이스는 한줄로 이루어져 있고, 강산이가 입력한 순서대로 길이가 L인 문자열이 주어진다. (1 ≤ L의 길이 ≤ 1,000,000) 강산이가 백스페이

www.acmicpc.net

글쓴이는 이 문제를 스택 두 개를 이용하여 해결하였다.

 

문제의 예제 중 첫번째 예제를 다음과 같이 생각해보면 스택 두 개로 문제를 어떻게 해결할 수 있을지 생각해내기 쉬울 것이다.

 

[): 스택1

(]: 스택2

 

<: [) 커서 (]

<<: [) 커서 (]

<<B: [B) 커서 (]

<<BP: [BP) 커서 (]

<<BP<: [B) 커서 (P]

<<BP<A: [BA) 커서 (P]

<<BP<A>: [BAP) 커서 (]

<<BP<A>>: [BAP) 커서 (]

<<BP<A>>C: [BAPC) 커서 (]

<<BP<A>>Cd: [BAPCd) 커서 (]

<<BP<A>>Cd-: [BAPC) 커서 (]

 

아래는 제출한 소스코드이다.

#include <iostream>
#include <string>
#include <stack>
using namespace std;
typedef long long ll;

stack<char> stkL;
stack<char> stkR;

int main() {
	ios::sync_with_stdio(0);
	cin.tie(0);

	int T; cin >> T;
	while (T--) {
		string s; cin >> s;
		for (auto x : s) {
			if (x == '<') {
				if (!stkL.empty()) {
					stkR.push(stkL.top());
					stkL.pop();
				}
			}
			else if (x == '>') {
				if (!stkR.empty()) {
					stkL.push(stkR.top());
					stkR.pop();
				}
			}
			else if (x == '-') {
				if (!stkL.empty()) {
					stkL.pop();
				}
			}
			else stkL.push(x);
		}
		while (!stkL.empty()) {
			stkR.push(stkL.top());
			stkL.pop();
		}
		while (!stkR.empty()) {
			cout << stkR.top();
			stkR.pop();
		}

		cout << '\n';
	}
}
728x90

'BOJ' 카테고리의 다른 글

[BOJ 5002 // C++] 도어맨  (0) 2021.06.22
[BOJ 1111 // C++] IQ Test  (0) 2021.06.21
[BOJ 1666 // C++] 최대 증가 직사각형 집합  (0) 2021.06.19
[BOJ 4195 // C++] 친구 네트워크  (0) 2021.06.18
[BOJ 20040 // C++] 사이클 게임  (0) 2021.06.17

+ Recent posts