본문 바로가기

CodingTest Practice

[Stack] 괄호문자 제거

괄호문자 제거

입력된 문자열에서 소괄호 ( ) 사이에 존재하는 모든 문자를 제거하고 남은 문자만 출력하는 프로그램을 작성

 

■ 문제 풀이

1) 입력 설명
- 첫 줄에 문자열이 주어진다.
- 문자열의 길이는 100을 넘지 않는다.

2) 출력 설명
- ( ) 소괄호 사이에 존재하는 문자가 제거된 남은 문자만 출력한다.

3) 테스트
- input : (A(BC)D)EF(G(H)(IJ)K)LM(N)
- output : EFLM

4) 문제풀이
- 첫번째 solution의 경우, 닫는 괄호가 아닌 경우에는 모두 stack에 담고 닫는 괄호인 경우 여는 괄호가 나올때까지 Stack에 쌓여있는 값들을 모두 꺼내서 최종적으로 stack에 저장된 값들을 출력
- 두번째 solution의 경우, 여는 괄호일 경우 stack에 저장하고 닫는 괄호가 나오면 stack에서 값을 pop()한다. stack이 비어있고, 닫는 괄호가 아닌 경우가 소괄호 사이의 값들이 아닌것으로 판단하여 그 값들을 Stringbuffer에 append 하여 출력

 

import java.util.Scanner;
import java.util.Stack;

public class Main {

    /**
     * 첫번째 solution
     */
    public static String solution(String input) {
        StringBuffer sb = new StringBuffer();
        Stack<Character> stack = new Stack<>();

        for (char c : input.toCharArray()) {
            if (c == ')') {
                while (stack.pop() != '(') ;
            } else stack.push(c);
        }

        for (char c : stack) {
            sb.append(c);
        }

        return sb.toString();
    }

    /**
     * 두번째 solution
     */
    public static String solution2(String input) {
        Stack<Character> stack = new Stack<>();
        StringBuffer sb = new StringBuffer();

        for (char c : input.toCharArray()) {
            if (c == '(') {
                stack.push(c);
            } else if (c == ')') {
                stack.pop();
            }

            if (stack.isEmpty() && c != ')') {
                sb.append(c);
            }
        }
        return sb.toString();
    }


    public static void main(String[] args) {
        final Scanner scanner = new Scanner(System.in);
        String input = scanner.nextLine().trim();

        System.out.println(solution(input));
        System.out.println(solution2(input));
    }
}

'CodingTest Practice' 카테고리의 다른 글

[인프런] 아나그램  (0) 2022.04.27
[인프런] 학급 회장  (0) 2022.04.26
[인프런] 이진수 출력  (0) 2022.04.22
[인프런] 재귀함수  (0) 2022.04.22
[인프런] 뒤집은 소수  (0) 2022.04.21