올바른 괄호

하이솝·2026년 3월 6일

2026.03.06

소요 시간: 17분
알고리즘 시간에 배운 스택,
객체지향언어2 시간에 배운 Vector,
JadenCase 문자열 만들기에서 배운 StringBuilder를 이용하여 문제를 해결함

나의 정답

import java.util.Vector;
class Solution {
    boolean solution(String s) {
        boolean answer = true;
        StringBuilder sb = new StringBuilder(s);
        Vector<Character> v = new Vector<Character>();
        for (int i = 0;  i < sb.length(); i++) {
            char c = sb.charAt(i);  
            if (c == '(') { 
                v.add(c);
            }
            else if (c == ')') {
                if (v.size() == 0) {
                    answer = false;
                    return answer;
                }
                else {
                    v.remove(v.size() - 1);
                }
            }
        }
        if (v.size() != 0) {
            answer = false;
            return answer;
        }
        return answer;
    }
}

AI 정답
Vector는 데이터의 동기화나 쓰레드 안정성을 위해 탄생한 클래스이기 때문에 알고리즘 문제를 풀기에는 너무 무겁다는 단점이 존재함
해당 문제를 풀기 위해서 동기화나 쓰레드가 사용되지 않으므로 부적합함

StringBuilder 대신 toCharArray()를 사용하는 이유는 메모리 사용량과 불필요한 작업 제거 때문임
StringBuilder는 문자열을 수정할 때에 사용하는 도구이므로 단순히
읽는 경우에는 읽기 작업에 최적화된 toCharArray()가 더 적합함

import java.util.ArrayDeque;
import java.util.Deque;
class Solution {
    boolean solution(String s) {
        // Deque는 Stack보다 빠르고 가벼움
        Deque<Character> stack = new ArrayDeque<>();
        for (char c : s.toCharArray()) {
            if (c == '(') {
                stack.push(c);
            } else if (c == ')') {
                // 스택이 비어있으면 닫는 괄호가 먼저 나온 것이므로 false
                if (stack.isEmpty()) return false;
                stack.pop();
            }
        }        
        // 스택이 비어있어야 모든 괄호가 짝을 이룬 것임
        return stack.isEmpty();
    }
}

AI 정답2
괄호의 종류가 여러개일 때에는
각 종류의 괄호를 세는 배열을 만들어서 해결 가능

class Solution {
    boolean solution(String s) {
        int count = 0;
        for (char c : s.toCharArray()) {
            if (c == '(') count++;
            else if (c == ')') count--;
            // 닫는 괄호가 더 많아지는 순간 바로 false
            if (count < 0) return false;
        }
        return count == 0;
    }
}

0개의 댓글