일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- 선형판별분석
- 2018
- 5397번
- secant
- chapter01
- 인공지능
- Perceptron Convergence theorem
- 자바ORM표준JPA프로그래밍
- 알고리즘대회
- 근구하기
- CH01
- falsePosition
- undirected graphical model
- 스터디
- 델타 rule
- chapter02
- 이것이 MySQL이다
- MySQL
- bisection
- SCPC
- 개발순서
- Numerical optimization
- 알고리즘
- Fisher discriminant analysis
- 선형분류
- graphical models
- 로지스틱 회귀
- directed graphical model
- 1차예선
- vector미분
- Today
- Total
computer_study
[스택/구현] BAEKJOON 5397번 '키로거'문제(c++/python) 본문
문제 : www.acmicpc.net/problem/5397
5397번: 키로거
문제 창영이는 강산이의 비밀번호를 훔치기 위해서 강산이가 사용하는 컴퓨터에 키로거를 설치했다. 며칠을 기다린 끝에 창영이는 강산이가 비밀번호 창에 입력하는 글자를 얻어냈다. 키로거�
www.acmicpc.net
-
문제 해결 아이디어
1. stack을 두개 사용하여 가운데에 cursor가 있다고 생각한다.

2. '-' 가 입력되면 left stack에서 pop을 한다.
3. '<'가 입력되면 커서가 왼쪽으로 옮겨가야 되므로, left stack의 top값을 빼서 right stack으로 옮긴다.
4. '>'가 입력되면 커서가 오른쪽으로 옮겨가야 되므로, right stack의 top값을 빼서 left stack으로 옮긴다.
5. 3,4번진행 중 stack이 비어있어 뺄 수 있는 top이 없다면 넘어간다.
6. 일반 문자가 입력되면 left stack에 넣어준다.
7. 문자열을 모두 읽은 후 left stack부터 right stack까지 출력해준다. (위 모양대로 뒤집어지지않게 출력해준다.)
-
python
test_case = int(input())
for _ in range(test_case):
left_stack = []
right_stack = []
data = input()
for i in data:
if i == '-':
if left_stack:
left_stack.pop();
elif i == '<':
if left_stack:
right_stack.append(left_stack.pop())
elif i == '>':
if right_stack:
left_stack.append(right_stack.pop())
else:
left_stack.append(i)
left_stack.extend(reversed(right_stack)) # right_stack의 top부터 이어서 저장하기 위해 reversed 해준다.
print(''.join(left_stack)) # 공백없이 left_stack의 값을 하나의 문자열로 합쳐서 출력한다.
-
c++
최초 result_stack이 있고, 커서가 왼쪽으로 옮겨갈 때 마다 result_stack의 top요소를 tmp_stack에 쌓는다.
(위 아이디어로 보면 result_stack == left_stack, tmp_stack == right_stack)
각 test_case끼리 영향을 주지 않도록, stack에서 top을 읽었으면 반드시 pop을 해준다.
#include <iostream>
#include <vector>
#include <stack>
using namespace std;
int main(){
int test_case;
cin >> test_case;
while(test_case){
string input;
stack<char> result_stack;
stack<char> tmp_stack;
int i = 0;
cin >> input;
int L = input.length();
while(L){
if(input[i] == '<'){
if(result_stack.empty())
;
else{
tmp_stack.push(result_stack.top());
result_stack.pop();
}
}
else if(input[i] == '>'){
if(tmp_stack.empty())
;
else{
char tmp;
tmp = tmp_stack.top();
tmp_stack.pop();
result_stack.push(tmp);
}
}
else if(input[i] == '-'){
if(result_stack.empty())
;
else
result_stack.pop();
}
else{
result_stack.push(input[i]);
}
i++;
L--;
}
while(!tmp_stack.empty()){
char tmp;
tmp = tmp_stack.top();
result_stack.push(tmp);
tmp_stack.pop();
}
int result_len = result_stack.size();
vector<char> result;
while(result_len){
result.push_back(result_stack.top());
result_stack.pop();
result_len--;
}
for(int i = result.size()-1 ; i>=0 ; i--){
cout << result[i];
}
cout << "\n";
test_case--;
}
return 0;
}
'알고리즘 > 문제풀이' 카테고리의 다른 글
[해시/union-find 알고리즘] BAEKJOON ' 4195'번 '친구 네트워크 '문제 (C++/python) (0) | 2020.08.05 |
---|---|
[해시/배열] BAEKJOON 1920번 '수 찾기'문제 (C++/python) (0) | 2020.08.03 |
[Queue/구현] BAEKJOON 1966번 '프린터 큐'문제(c++/python) (0) | 2020.07.31 |
[스택/그리디] BAEKJOON 1874번 '스택 수열 '문제 (c++/python) (0) | 2020.07.26 |
[완전탐색] BAEKJOON 2798번 '블랙잭' 문제 (0) | 2020.07.25 |