ezhoon

[인프런] 05_01 올바른 괄호 본문

[Java] 인프런 문제풀이/Stack, Queue (자료구조)

[인프런] 05_01 올바른 괄호

ezhoon 2022. 1. 26. 20:02

📖  문제


  • 첫 줄에 괄호로만 이루어진 문자열 입력
    • 괄호가 입력되면 올바른 괄호면 "YES" 올바르지 않으면 "NO"를 출력

출력 예시

 

⚠️  주의사항


  • Stack 사용해서 풀어보겠습니다.
  • 여는 괄호가 많은 경우 닫는 괄호가 많은 경우 두 가지 다 생각해야 합니다.

 

✍️  이해


 

/**
 * 1. 첫 줄에 괄호 문자열 입력
 * 2. "(" 일 경우 push ")" 일 경우 pop
 *  2.1 ")" 인데 stack이 empty일 경우 answer = NO, break;
 * 3. "(" 즉 여는 괄호가 많은 경우도 체크 해야 함
 * 4. return answer
 */

 

위 그림처럼 "(()(()))(()" 입력된 경우 stack에 쌓이고 빠지는 과정입니다.

✏️  풀이


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

public class Main {

    public String solution(String str) {

        String answer = "YES";

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

        for (int i = 0; i < str.length(); i++) {
            if(String.valueOf(str.charAt(i)).equals("(")) { // "(" 인지 확인 하고 맞으면 push 아닌 경우 pop
                stack.push("(");
                // System.out.println("stack = " + stack);
            }
            else{
                if (stack.empty()) { // ")" 인 경우 무조건 pop이 아닌 stack안에 값이 비어있는지 확인해야 한다.
                    answer = "NO";
                    break;
                }
                // System.out.println("stack = " + stack);
                stack.pop();
            }
        }
        if (!stack.empty()) answer = "NO"; 
        // "("가 ")"보다 많은 경우 위에 for문 안의 if문으로는 찾을 수가 없으므로 마지막에 확인해줘야한다.
        
        return answer;
    }

    public static void main(String[] args) throws IOException {

        Main T = new Main();
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        String str = br.readLine();

        System.out.println(T.solution(str));
    }
}

 

stack 쌓이고 빠지는 과정

위 그림처럼 "(()(()))(()" 입력 된 경우 stack에 쌓이고 빠지는 과정입니다.

Comments