Post

Stack_괄호 밖 문자만 출력하기

✅ 입력된 문자열에서 괄호 사이에 존재하는 문자를 제거하고 남은 문자만 출력하세요

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
class Main {

    public String solution(String input){
        String answer= "";
        Stack<Character> stack= new Stack<>();
        for(char c: input.toCharArray()){
            if(c==')') {
                while(stack.pop() !='('); // (을 만나기 전까지 다 지우기
            }
            else stack.push(c);
        }
        for(int i=0; i<stack.size(); i++){ //괄호 밖 문자들을 answer에 추가
            answer += stack.get(i);
        }
        return answer;
    }
    public static void main(String[] args) {
        Main T = new Main();
        Scanner sc= new Scanner(System.in);
        String input= sc.next();
        System.out.print(T.solution(input));

    }
}
//⭐️input:
//(A(BC)D)EF(G(H)(IJ)K)LM(N)
//⭐️output:
//EFLM
  1. )이 아니면 일단 stack에 추가한다.
  2. 계속 추가하다가 )을 만나면 )의 짝궁 (까지 모두 삭제
  3. 그러면 stack에 괄호 밖에 있는 문자만 남는다.
  4. 이 문자들을 answer에 추가

🔵 ThingsILearned

✔️ stack.size()

✔️ stack.get(i)

✔️ while(stack.pop() !='(');

stack.pop()한게 (이 아닌 동안 계속 pop
따라서 pop은 지우기 뿐만 아니라 지운 값을 return 한다.
예를 들어, stack이 있을 때 pop

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Stack<Character> stack= new Stack<>();
stack.push('A');
stack.push('B');

//pop은 지우기 뿐만 아니라 지운 값을 return한다.
stack.pop(); //return B

Stack<Character> stack= new Stack<>();
stack.push('(');
stack.push('A');
stack.push('B');
stack.push(')');

for(int i=0; i<stack.size(); i++){
    if( stack.get(i) ==')') {
        System.out.println(stack.pop()); // B
    }
}

🟢 More Simple Code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class Main {

    public String solution(String input){
        String answer= "";
        Stack<Character> stack= new Stack<>();
        for(char c: input.toCharArray()){
            if(c== '(') stack.push(c);
            else if(c==')') stack.pop();
            else{
                if(stack.isEmpty()) answer += c;
            }

        }
        return answer;
    }
    public static void main(String[] args) {
        Main T = new Main();
        Scanner sc= new Scanner(System.in);
        String input= sc.next();
        System.out.print(T.solution(input));

    }
}
  1. stack에 '('를 넣는다.
  2. 그리고 ')'를 만나면 '('를 지운다.
  3. 앒파벳을 만나면 stack에는 아무것도 넣지 않는다.
  4. 다만 stack이 비었는지 안 비었는지 확인하고, 비었다면 그 다음 오는 문자를 answer에 추가한다.
This post is licensed under CC BY 4.0 by the author.