문제 설명

총 4가지 종류의 괄호가 있습니다.

각 괄호들은 서로 짝이 있으며 그 짝은 괄호가 열리고 닫히는 것을 의미합니다.

· ( , )

· { , } 

· [ , ]

· < , >

이때 주어진 문자열 S가 괄호가 서로 교차하지 않은 형태로 짝이 잘 맞게 이루어진 문자열인지 판단하여 맞으면 1, 틀리면 0으로 반환하는 프로그램을 구현하세요.


입력 형식

· S : 본문에 주어진 괄호들로만 이루어진 문자열


출력 형식

· 괄호의 짝이 맞으면 1, 맞지 않으면 0을 정수로 반환


제약 사항

· 0 < S.length <= 100


입출력 예시

· 예시1

  · 입력 

      · S = "(()){[<>]}"

  · 출력 : 1

  · 설명 : 모든 괄호 짝이 맞기 때문에 1을 출력

 

· 예시2

  · 입력

      · S = "({)}[<]>"

  · 출력 : 0

  · 설명 : 열린 괄호가 순서대로 닫히지 않았기 때문에 0을 출력


작성 코드

(20/20) - 이해 아직 덜 됨

import java.util.Stack;

public class Solution {
    public int solution(String S) {
        Stack<Character> stack = new Stack<>();

        int i = 0;
        for(; i< S.length(); i++){
            char ch = S.charAt(i);
            boolean result = false;

            switch (ch) {
                case '(' :
                case '{' :
                case '[' :
                case '<' :
                    stack.push(ch);
                    break;

                case ')' :
                    if (stack.isEmpty() || stack.peek() != '(') result = true;
                    stack.pop();
                    break;
                case '}' :
                    if (stack.isEmpty() || stack.peek() != '{') result = true;
                    stack.pop();
                    break;
                case ']':
                    if (stack.isEmpty() || stack.peek() != '[') result = true;
                    stack.pop();
                    break;
                case '>':
                    if (stack.isEmpty() || stack.peek() != '<') result = true;
                    stack.pop();
                    break;
            }
            if(result) break;
        }
        if(stack.isEmpty() && i == S.length()) return 1;
        else return 0;
    }
}

 

정답 코드

import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import java.util.Stack;

class Solution {
    public int solution(String S) {
        Stack<Character> stack = new Stack<>();
        Map<Character, Character> map = new HashMap<>();
        Set<Character> openerSet = Set.of('(', '{', '<', '[');
        Set<Character> closerSet = Set.of(')', '}', '>', ']');

        map.put(')', '(');
        map.put('}', '{');
        map.put('>', '<');
        map.put(']', '[');

        for (char c: S.toCharArray()) {
            if (openerSet.contains(c)) {
                stack.push(c);
            } else if (closerSet.contains(c)) {
                if (!stack.isEmpty()) {
                    char top = stack.pop();
                    if (map.get(c) != top) {
                        return 0;
                    }
                } else {
                    return 0;
                }
            }
        }

        if (stack.isEmpty()) {
            return 1;
        } else {
            return 0;
        }
    }

    public static void main(String[] args) {
        Solution st = new Solution();
        String S = "(()){[<>]}";
        System.out.println(st.solution(S));
        String S1 = "({)}[<]>";
        System.out.println(st.solution(S1));
    }
}

이 Java 코드는 주어진 문자열이 적절히 중첩되고 균형 잡힌 괄호 쌍을 포함하는지 확인하는 문제의 코드이다.

위 코드는 스택과 맵을 사용하여 여는 괄호와 닫는 괄호를 추적한다.

입력 문자열에서 각 문자를 반복하며, 여는 괄호를 스택에 저장합니다. 각 닫는 괄호에 대해, 스택이 비어있지 않은 경우 스택에서 맨 위의 요소를 팝하고 해당하는 여는 괄호와 비교한다.

스택이 비어 있으면 문자열에 적절한 괄호 쌍이 있음을 반환하고, 그렇지 않으면 문자열에 적절한 괄호 쌍이 없음을 반환