mojo's Blog

[백준 5397] 키로거 본문

백준/Stack, Queue

[백준 5397] 키로거

_mojo_ 2021. 7. 1. 18:54

문제 링크 => 5397번: 키로거 (acmicpc.net)

 

5397번: 키로거

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

www.acmicpc.net


Stack을 활용한 문제이다.

 

Stack, Queue 관련 문제를 해결하다 보면 런타임에러가 종종 일어나기 마련인데 이번에도 한번에 패스하지 못했다.

 

일단, '<', '>' 와 같은 화살표로 커서를 움직여서 문자를 받아올때 해당 커서의 위치에서 문자가 들어오는게 핵심이다.

 

또한 '-' 와 같은 문자가 들어오는 경우, 커서의 왼쪽에 위치하는 문자를 제거해준다.

 

이때 내가 놓쳤던 부분은 '-' 를 받아올 때, pop을 하는 과정에서 예외처리를 신경써주지 못해 런타임에러가 발생하였다.

 

Stack s1, s2 2개를 활용하고 '<', '>' 와 같은 화살표와 '-' 가 들어올 때의 operation 은 다음과 같다.

(이때, s1은 최종 문자를 표현하기 위한 Stack이며 s2는 커서의 operation을 처리하기 위한 용도다)

 

'<' => s1에 담긴 문자를 s2에 옮기는 작업을 해준다.

 

'>' => s2에 담긴 문자를 s1에 옮기는 작업을 해준다.

 

'-' => s1에 담긴 문자를 pop 해준다.

 

그 외 => s1에 문자를 push 해준다.

 

모든 작업이 완료되면 커서가 중간에 배치될 경우에 대해서 커서 이후의 문자들을 담은 s2 를 s1에 전부 push 하고

 

s1 에 존재하는 모든 문자들을 string res="" 에다가 붙여주고 reverse 해준 그 결과가 답이다.


풀이 code

#define _CRT_SECURE_NO_WARNINGS
#include <string>
#include <stdio.h>
#include <math.h>
#include <iostream>
#include <vector>
#include <algorithm>
#include <map>
#include <queue>
#include <set>
#include <stack>
#include <time.h>
#define INF 100000000
#define endl '\n'

using namespace std;

void test() {
	stack<char> s1;
	stack<char> s2;
	string str;
	cin >> str;
	for (int i = 0; i < str.size(); i++) {
		char c = str[i];
		if (c == '<') {
			if (s1.size()) {
				s2.push(s1.top());
				s1.pop();
			}
		}
		else if (c == '>') {
			if (!s2.empty()) {
				s1.push(s2.top());
				s2.pop();
			}
		}
		else if (c == '-') {
			if(s1.size()) s1.pop();
		}
		else {
			s1.push(c);
		}
	}
	while (!s2.empty()) {
		s1.push(s2.top());
		s2.pop();
	}
	string res = "";
	while (!s1.empty()) {
		res += s1.top();
		s1.pop();
	}
	reverse(res.begin(), res.end());
	cout << res << endl;
}

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

	int t;
	cin >> t;
	for (int i = 0; i < t; i++) {
		test();
	}
	
	return 0;
}

 

'백준 > Stack, Queue' 카테고리의 다른 글

[백준 1655] 가운데를 말해요  (0) 2021.08.05
[백준 11003] 최솟값 찾기  (0) 2021.07.10
[백준 2504] 괄호의 값  (0) 2021.07.01
Comments