백준 5397번: 키로거 [스택][Stack][덱][Deque][자료구조]- Java :: 매운코딩
728x90
300x250

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

 

5397번: 키로거

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

www.acmicpc.net

 

Stack 2개를 이용해서 푸는 문제

String 으로 답을 연산하려다가 시간초과 발생..

 

왼쪽 stack을 deque로 바꾸어 스택처럼 사용하다가 최종 출력때만 queue로 사용한다.

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.Deque;
import java.util.LinkedList;
import java.util.Stack;

public class Main {

	public static void main(String[] args) throws IOException {
		// TODO Auto-generated method stub

		//System.setIn(new FileInputStream("Test.txt"));
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		int T = Integer.parseInt(br.readLine());
		
		for (int tc = 0; tc < T; tc++) {
			
			String log = br.readLine();
			
			
			//커서를 기준으로 입력값 나눔
			Deque<Character> Lstk = new LinkedList<Character>();
			Stack<Character> Rstk = new Stack<Character>();
			
			for (int i = 0; i < log.length(); i++) {
				char ch = log.charAt(i);
				
				if(ch=='<') {
					if(!Lstk.isEmpty()) {
						Rstk.add(Lstk.pollLast()); //왼쪽 --> 오른쪽으로 옮기기
					}
				} else if(ch=='>') {
					if(!Rstk.isEmpty()) {
						Lstk.addLast(Rstk.pop()); //왼쪽 --> 오른쪽으로 옮기기
					}
				} else if(ch=='-'){
					if(!Lstk.isEmpty()) {
						Lstk.pollLast();
					}
				} else {
					Lstk.addLast(ch);
				}
			}
//			System.out.println(Lstk);
			String res = "";
			BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
			
			
			
			while(!Lstk.isEmpty()) {
//				res = Lstk.pop()+res;
				bw.write(Lstk.pop());
			}
			
			while(!Rstk.isEmpty()) {
//				res += Rstk.pop();
				bw.write(Rstk.pop());
			}
			
//			System.out.println(res);
			bw.append("\n");
			bw.flush();
		}
	
	}

}
728x90

+ Recent posts