코디잉

9012번: 괄호 [JAVA] 본문

자료구조&알고리즘/백준

9012번: 괄호 [JAVA]

yong_ღ'ᴗ'ღ 2023. 7. 18. 21:43

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

 

9012번: 괄호

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

www.acmicpc.net

 

 

1) BufferedReader 사용 (230817 다시 풀어봄)

접근 방식)

1. Character 스택 만들어서 T 만큼 반복문 수행

2. 현재 문자열 길이만큼 반복문 수행

2-1. 현재 char가 '(' 면 stack에 push

2-2. 현재 char가 ')' 인데 

    2-2-1. stack이 비어있다면 noFlag = true 바꾸고 break;

    2-2-2. stack.peek() == '(' 라면, stack.pop()

    2-2-3. stack.peek() == ')' 라면, noFlag = true 바꾸고 break; 

3. 반복문 완료했을 때, 스택이 비어있고 && noFlag변수가 false라면 → YES  / 아니면 → NO

package tony_git.data_structure;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
public class B_9012 {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int T = Integer.parseInt(br.readLine());
        Stack<Character> stack;
        StringBuilder sb = new StringBuilder();

        for (int i = 0; i < T; i++) {
            String s = br.readLine();
            stack = new Stack<>();
            boolean noFlag = false;

            for (int j = 0; j < s.length(); j++) {
                noFlag = false;
                char now = s.charAt(j);
                if (now == '(') {
                    stack.push(now);
                } else {
                    if (stack.isEmpty()) {
                        noFlag = true;
                        break;
                    } else if (stack.peek() == '(') {
                        stack.pop();
                    } else {
                        noFlag = true;
                        break;
                    }
                }
            }
            if (stack.isEmpty() && !noFlag)
                sb.append("YES").append('\n');
            else
                sb.append("NO").append('\n');
        }
        System.out.println(sb);
    }
}

 

 

2) Scanner 사용 (230718 solve)

접근 방식)

1. Character 스택 만들어서 T 만큼 반복문 수행

2. 현재 문자열 길이만큼 반복문 수행

2-1. 현재 char가 '(' 면 stack에 push

2-2. 현재 char가 ')' 인데 stack이 비어있다면 break;

(→ 3번 StringBuilder에 NO로 추가되게 하기 위해서 stack에 현재 문자열 push해주고 break)

2-3. 그 외상황이라면 [현재 char가 ')'이고, stack 맨 위에 있는건 '('인 상황] pop

3. 스택 상태를 확인해서 비어있다면 StringBuilder에 YES추가. 아니라면 NO 추가

package tony_git.data_structure;

import java.util.*;
public class B_9012 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int T = sc.nextInt();
        Stack<Character> stack;
        StringBuilder sb = new StringBuilder();

        for (int i = 0; i < T; i++) {
            String s = sc.next();
            stack = new Stack<>();
            for (int j = 0; j < s.length(); j++) {
                char now = s.charAt(j);
                if (now == '(')
                    stack.push(now);
                // ')'이고 stack 비어있으면 NO라고 출력해주기 위해 push하고 break;
                else if (stack.isEmpty()) {
                    stack.push(now);
                    break;
                } else
                    stack.pop();
            }
            if (stack.isEmpty())
                sb.append("YES").append('\n');
            else
                sb.append("NO").append('\n');
        }
        System.out.println(sb);
    }
}
Comments