본문 바로가기
알고리즘 문제풀이 입문: 코딩테스트 대비/섹션 5. Stack, Queue(자료구조)

괄호 문자 제거

by _비니_ 2024. 4. 12.

.

설명

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

 

입력

첫 줄에 문자열이 주어진다. 문자열의 길이는 100을 넘지 않는다.

 

출력

남은 문자만 출력한다

예시 입력 1 

(A(BC)D)EF(G(H)(IJ)K)LM(N)

예시 출력 1

EFLM

 

 

문제 해결

 

( 를 만나면 스택에 push, ) 를 만났는데 스택이 비어있지 않으면 ( 를 pop 하는 방식으로 접근했다.

만약 스택이 비어있다면 괄호 밖에 있음을 의미하므로 출력해주면 된다.

 

입력 받은 문자열을 char형으로 변환해 한 글자 한 글자를 추출해준다.

for (char ch : str.toCharArray()) {

 

  • ch가 '('인 경우, 스택에 push
  • ch가 ')'인 경우, 스택이 비어있지 않고 스택의 최상단에 '('가 있을 경우, 스택에서 pop
  • 그 외의 경우 (ch가 괄호가 아닌 문자), 스택이 비어있으면(즉, 괄호 밖의 문자라면) 해당 문자를 출력해주는 방식으로 동작하는 코드이다.
if (ch == '(') {
    stack.push(ch);
} else if (ch == ')') {
    if (!stack.isEmpty() && stack.peek() == '(') {
        stack.pop();
    }
} else {
    if (stack.isEmpty()) {
        System.out.print(ch);
    }
}

 

 

최종 코드

 

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

public class P02_괄호문자제거 {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        String str = in.nextLine();

        Stack<Character> stack = new Stack<>();

        // ( 를 만나면 스택에 push, )를 만났는데 스택이 비어있지 않으면 (를 pop,
        // 스택이 비어있으면 (괄호 밖이므로) 출력

        // (A(BC)D)EF(G(H)(IJ)K)LM(N)
        for (char ch : str.toCharArray()) {
            if (ch == '(') {
                stack.push(ch);
            } else if (ch == ')') {
                if (!stack.isEmpty() && stack.peek() == '(') {
                    stack.pop();
                }
            } else {
                if (stack.isEmpty()) {
                    System.out.print(ch);
                }
            }
        }

        System.out.println();
    }
}
반응형