Seren dev's blog
article thumbnail

https://www.acmicpc.net/problem/9012

 

9012번: 괄호

괄호 문자열(Parenthesis String, PS)은 두 개의 괄호 기호인 ‘(’ 와 ‘)’ 만으로 구성되어 있는 문자열이다. 그 중에서 괄호의 모양이 바르게 구성된 문자열을 올바른 괄호 문자열(Valid PS, VPS)이라고

www.acmicpc.net

풀이

대표적인 스택 문제다. '(' 왼쪽 괄호를 만나면 스택에 push하고, ')' 오른쪽 괄호를 만나면 스택을 pop한다.

이 때 ')' 오른쪽 괄호를 만나면 스택을 pop했는데 pop한 문자열이 ( 가 아니라면 올바른 괄호 문자열이 될 수 없다.

로직

1. n을 입력받는다.

2. n번 동안 괄호 문자열을 입력받고 blankStr(str)을 호출하여 올바른 괄호 문자열인지 검사하고 그에 따라 YES 또는 NO를 출력한다.

boolean blankStr(String str) : 주어진 괄호 문자열이 올바른 괄호 문자열이면 true, 아니면 false 리턴

public static boolean blankStr(String str) {
    	Stack<Character> st = new Stack<>();
    	
    	for (char ch : str.toCharArray()) {
    		// '('를 입력하면 push
    		if (ch == '(')
    			st.push(ch);
    		// ')' 입력하면 pop했을 때 (가 아니거나 빈 스택이면 false 리턴
    		else {
    			if (st.isEmpty() || st.pop() != '(')
    				return false;
    		}
    	}
    	
    	return st.isEmpty();
    }

1) 문자열을 char 배열로 바꾼다음 각 문자마다 다음을 수행한다.

2) '(' 를 입력하면 push

3) ')' 를 입력하면, 스택이 비었거나 pop한 문자가 '(' 가 아니라면 false 리턴

4) for문 수행 후, 스택이 비어있으면 true 리턴, 아니면 false 리턴

 

코드

import java.io.*;
import java.util.*;

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

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        
        int n = Integer.parseInt(br.readLine());
        
        while(n-- > 0) {
        	String str = br.readLine();
        	bw.write(blankStr(str) ? "YES" : "NO");
        	bw.write("\n");
        }
        
        bw.flush();
        bw.close();
        br.close();
    }
    
    public static boolean blankStr(String str) {
    	Stack<Character> st = new Stack<>();
    	
    	for (char ch : str.toCharArray()) {
    		// '('를 입력하면 push
    		if (ch == '(')
    			st.push(ch);
    		// ')' 입력하면 pop했을 때 (가 아니거나 빈 스택이면 false 리턴
    		else {
    			if (st.isEmpty() || st.pop() != '(')
    				return false;
    		}
    	}
    	
    	return st.isEmpty();
    }
}
728x90
profile

Seren dev's blog

@Seren dev

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!