알고리즘/SWEA

[JAVA][SW Expert Academy] 1218. 괄호 짝짓기

minddi 2022. 8. 19. 01:49

 

 [SW Expert Academy] 1218. 괄호 짝짓기

※ SW Expert 아카데미의 문제를 무단 복제하는 것을 금지합니다.

 

https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV14eWb6AAkCFAYD

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com


 문제 내용

4 종류의 괄호문자들 '()', '[]', '{}', '<>' 로 이루어진 문자열이 주어진다.
이 문자열에 사용된 괄호들의 짝이 모두 맞는지 판별하는 프로그램을 작성한다.
예를 들어 아래와 같은 문자열은 유효하다고 판단할 수 있다.

아래와 같은 문자열은 유효하지 않은 문자열이다. 붉은색으로 표시된 괄호의 짝을 찾을 수 없기 때문이다.

아래 문자열은 열고 닫는 괄호의 개수는 유효하나 짝이 맞지 않는 괄호가 사용 되었기 때문에 유효하지 않다.


[입력]
각 테스트 케이스의 첫 번째 줄에는 테스트케이스의 길이가 주어지며, 바로 다음 줄에 테스트 케이스가 주어진다.
총 10개의 테스트케이스가 주어진다.

[출력]
#부호와 함께 테스트 케이스의 번호를 출력하고, 공백 문자 후 유효성 여부를 1 또는 0으로 표시한다 (1 - 유효함, 0 - 유효하지 않음).
 
 

 해결 순서

1. Stack 클래스 사용
2. 스택이 비어있을 때 입력값이 닫힌 괄호이면? 0 : 열린괄호는 push
3. 스택이 비어있지 않을 때 입력값이 닫힌 괄호이면? 짝이 맞는지 확인 : 열린괄호는 push

  > 짝 확인 => stack.pop == 입력값? 1 : 0

 

 

 문제 풀이

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
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
import java.util.Stack;
import java.io.BufferedReader;
import java.io.InputStreamReader;
 
public class Solution
{
    public static void main(String args[]) throws Exception
    {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int T = 10;
        
        for(int test_case = 1; test_case <= T; test_case++)
        {
            int len = Integer.parseInt(br.readLine());;
            String s = br.readLine();
            Stack<Character> stack = new Stack<>();
            int flag = 0;
            
            for (int i = 0; i < len; i++) {
                char c = s.charAt(i);
                
                if (stack.isEmpty()) {                        // 스택이 비어있으면
                    if (isClosed(c)) {                        // 닫힌 괄호 여부 확인
                        flag = 0;
                        break;
                    } else {
                        stack.push(c);
                        flag = 1;
                    }
                } else {                                    // 스택이 비어있지 않으면
                    if (isClosed(c)) {                        // 닫힌 괄호 여부 확인
                        if (isEquals(stack.pop(), c)) {        // 짝 일치 여부 
                            flag = 1;
                        } else {
                            flag = 0;
                            break;
                        }
                    } else {
                        stack.push(c);
                        flag = 1;
                    }
                }
            }
            System.out.println("#" + test_case + " " + flag);
        }
    }
    
    public static boolean isClosed(char c) {    // 닫힌 괄호 여부 확인
        if (c == ')' || c == ']' || c == '}' || c == '>') {
            return true;
        } else {
            return false;
        }
    }
    
    public static boolean isEquals(char c1, char c2) {    // 짝 일치 여부 확인
        if ((c1 == '(' && c2 == ')'|| (c1 == '[' && c2 == ']'
                || (c1 == '{' && c2 == '}'|| (c1 == '<' && c2 == '>')) {
            return true;
        } else {
            return false;
        }
    }
}
cs