알고리즘/문제풀이 - 프로그래머스

[프로그래머스] 올바른 괄호 Java

나규태 2021. 9. 29. 01:12
문제 링크 : https://programmers.co.kr/learn/courses/30/lessons/12909
레벨 : Level 2
분류 : 연습문제
 

코딩테스트 연습 - 올바른 괄호

괄호가 바르게 짝지어졌다는 것은 '(' 문자로 열렸으면 반드시 짝지어서 ')' 문자로 닫혀야 한다는 뜻입니다. 예를 들어 "()()" 또는 "(())()" 는 올바른 괄호입니다. ")()(" 또는 "(()(" 는 올바르지 않은

programmers.co.kr

이 문제는 스택을 활용한 문제로 유명하다.

스택에 첫 번째 문자를 넣고 두 번째 문자부터 배열을 돌려 스택에 있는 문자와 배열의 문자가 괄호를 이루는지 확인하는 문제이다.

스택을 활용하지 않고 int로 괄호가 열렸을 때 증가, 괄호가 닫혔을 때 감소를 하여 최종적으로 int 값이 0을 넘어서는지 확인하면 된다.

아래의 풀이를 보면 쉽게 이해할 수 있을 것이다.

 

아래와 같이 두 가지 풀이를 공유합니다.

 

Stack을 이용한 풀이 1

import java.util.Stack;

class Solution {
    boolean solution(String s) {
        
        char firstChar = s.charAt(0);
        char lastChar = s.charAt(s.length()-1);
        
        if(firstChar == ')' || lastChar == '(') return false;
        
        Stack<Character> stc = new Stack<>();
        
        for(int i = 0; i < s.length(); i++) {
            char c = s.charAt(i);
            if(c == '(') {
                stc.push(c);
            }else {
                if(stc.isEmpty()) return false;
                
                stc.pop();
            }
        }

        return (!stc.isEmpty()) ? false : true;
    }
}

 

기본형을 이용한 풀이 2

class Solution {
    boolean solution(String s) {
        
        if(s.charAt(0) == ')') return false;
        
        int basketCount = 0;
        
        for(int i = 0; i < s.length(); i++) {
            char b = s.charAt(i);
            
            if(b == '(') {
                basketCount++;
            }else {
                if(basketCount <= 0) return false;
                basketCount--;
            }
        }

        return (basketCount > 0) ? false : true;
    }
}