백준(Java)/23년 8월

[Java] 백준 - 5397번: 키로거

C0MPAS 2023. 8. 15. 16:24

8월 15일(화) - 자료 구조 (5397번)

 

5397번: 키로거

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

www.acmicpc.net

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

 

문제점

1. StringBuilder 내장 메서드를 사용하면 시간초과가 발생

-> 2개의 스택을 활용하는 풀이로 변경

 

2. case '<', case '>', case '-', default 구문마다 break를 빼먹었더니 예제의 출력이 엉망으로 나옴

-> break 추가이후 정상 출력

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

 

풀이

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

import java.util.Stack;

public class Main {

    public static void main(String[] args) throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        int test_case = Integer.parseInt(br.readLine());
        String line;
        for(int i=0; i<test_case; i++)
        {
            line = br.readLine();

            StringBuilder sb = new StringBuilder();
            Stack<Character> pwd_stack = new Stack<>();
            Stack<Character> delete_stack = new Stack<>();

            for(int j=0; j<line.length(); j++)
            {
                switch (line.charAt(j))
                {
                    case '<':
                    {
                        if( !(pwd_stack.isEmpty()))
                        {
                            delete_stack.push(pwd_stack.pop());
                        }
                        break;
                    }
                    
                    case '>':
                    {
                        if( !(delete_stack.isEmpty()))
                        {
                            pwd_stack.push(delete_stack.pop());
                        }
                        break;
                    }
                    
                    case '-':
                    {
                        if( !(pwd_stack.isEmpty()))
                        {
                            pwd_stack.pop();
                        }
                        break;
                    }
                    
                    default:
                    {
                        pwd_stack.push(line.charAt(j));
                        break;
                    }
                }
            }

            while( !(delete_stack.isEmpty()))
            {
                pwd_stack.push(delete_stack.pop());
            }
            for(int j=0; j<pwd_stack.size(); j++)
            {
                sb.append(pwd_stack.elementAt(j));
            }

            System.out.println(sb);
        }
    }
}

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ