코테/백준

[백준/JAVA] 9012번: 괄호

imname1am 2023. 4. 11. 00:47
반응형

🔺 문제

 

9012번: 괄호

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

www.acmicpc.net

 

🔺 코드

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

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        int T = Integer.parseInt(br.readLine());
        String[] arr = new String[T];

        for(int i = 0 ; i < T ; i++) {
            Stack<String> stack = new Stack<>();

            String[] ss = br.readLine().split("");

            for(int j = 0 ; j < ss.length ; j++) {
                if(ss[j].equals("(")) {
                    stack.push("(");
                }
                else {	// (ss[j].equals(")"))
                    if(stack.isEmpty()) {
                        stack.add(")");
                    }
                    else if(!stack.isEmpty() && stack.peek().equals("(")){
                        stack.pop();
                    }
                }
            }

            arr[i] = stack.isEmpty() ? "YES" : "NO";
        }

        for(String result : arr) {
        	System.out.println(result);
        }
    }
}
✅ 해결 아이디어
- 스택
- 여는 괄호인 경우 : 스택에 값 추가
- 닫는 괄호인 경우
└ 1) 스택이 비어있는 경우, 스택에 값 추가 (21-22번째 줄)
└ 2) 스택이 비어있지 않고, 최상위 값이 여는 괄호일 때, 스택의 최상위 값 삭제 (24-25번째 줄)
- 스택이 비어있다면,  올바른 괄호 문자열이라 "YES" / 안 비어있다면 "NO"

 


🔺 다른 풀이들

- 풀이1) Stack<Character>

 

[백준 9012번] java(자바) 스택(stack) 개념과 활용 - 자료구조

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

konkukcodekat.tistory.com

스택을 Character형으로 받으셨다.

 

 

- 풀이2) StringBuilder로 출력

 

[백준] 9012번 : 괄호 – JAVA [자바]

https://www.acmicpc.net/problem/9012 9012번: 괄호 괄호 문자열(Parenthesis String, PS)은 두 개의 괄호 기호인 ‘(’ 와 ‘)’ 만으로 구성되어 있는 문자열이다. 그 중에서 괄호의 모양이 바르게 구성된 문자열

propercoding.tistory.com

StringBuilder로 출력하셨다.

 

 

- 풀이3) 중간에 break문 처리

 

[백준 9012번] - 괄호 java

https://www.acmicpc.net/problem/9012 9012번: 괄호 괄호 문자열(Parenthesis String, PS)은 두 개의 괄호 기호인 ‘(’ 와 ‘)’ 만으로 구성되어 있는 문자열이다. 그 중에서 괄호의 모양이 바르게 구성된 문자열

connie.tistory.com

break문 쓰실 생각을,,,!

그리고 중간에 stack.clear(); 이것도 하셨다.


💬 느낀 점

스택 재밌어~~ 프로그래머스에서도 이런 비슷한 문제가 있다. (올바른 괄호)

 

https://school.programmers.co.kr/learn/courses/30/lessons/12909

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

(+12.5 2회독)

스택에 Character형으로 괄호를 받고, StringBuilder를 활용해 출력했다.

코드 확인하기
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
import java.util.*;
import java.io.*;
 
public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sb = new StringBuilder();
        
        int T = Integer.parseInt(br.readLine());
        
        while(T --> 0) {
            String str = br.readLine();
            
            sb.append(solve(str) ? "YES" : "NO");
            sb.append("\n");
        }
        
        System.out.println(sb);
    }
    
    private static boolean solve(String str) {
        Stack<Character> stack = new Stack<>();
        char[] ch = str.toCharArray();
        
        for(int i = 0 ; i < ch.length ; i++) {
            if(ch[i] == '(') {
                stack.push('(');
            }
            else {
                if(!stack.isEmpty() && stack.peek() == '(') {
                    stack.pop();
                }
                else {
                    stack.push(ch[i]);
                }
            }
        }
        
        if(stack.isEmpty())
            return true;
        return false;
    }
}
 
cs

 

 

 

(+12.22 3회독)

코드 확인하기
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
import java.util.*;
import java.io.*;
 
public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sb = new StringBuilder();
        
        int N = Integer.parseInt(br.readLine());
        
        while(N --> 0) {
            char[] ch = br.readLine().toCharArray();
            Stack<Character> stack = new Stack<>();
            
            for(int i = 0 ; i < ch.length ; i++) {
                if(ch[i] == '(') {
                    stack.push('(');
                }
                else {
                    if(!stack.isEmpty() && stack.peek() == '(') {
                        stack.pop();
                    }
                    else {
                        stack.push(')');
                    }
                }
            }
            
            sb.append(stack.isEmpty() ? "YES" : "NO").append("\n");
        }
        
        System.out.println(sb);
    }
}
 
cs

 

반응형