알고리즘/프로그래머스

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

반응형

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

 

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

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

programmers.co.kr


문제

문제 설명

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

  • "()()" 또는 "(())()" 는 올바른 괄호입니다.
  • ")()(" 또는 "(()(" 는 올바르지 않은 괄호입니다.

'(' 또는 ')' 로만 이루어진 문자열 s가 주어졌을 때, 문자열 s가 올바른 괄호이면 true를 return 하고, 올바르지 않은 괄호면 false를 return 하는 solution 함수를 완성해 주세요.

제한사항

  • 문자열 s의 길이 : 100,000 이하의 자연수
  • 문자열 s는 '(' 또는 ')' 로만 이루어져 있습니다.

입출력 예

s answer
"()()" true
"(())()" true
")()(" false
"(()(" false

입출력 예 설명

입출력 예 #1,2,3,4
문제의 예시와 같습니다.


풀이

풀이 과정

스택을 이용하여 괄호가 짝을 이루는 경우 스택에서 제거하여 문자열을 끝까지 검사하였을 때 스택의 사이즈가 0이면 올바른 괄호로 판단하는 방향으로 풀이

정답을 저장할 boolean 변수와 스택을 선언하고 반복문으로 문자열을 앞에서 부터 한 글자씩 비교

boolean answer = true;
Stack<Character> stack = new Stack<>();
        
for(int i = 0; i < s.length(); i++){
    char c = s.charAt(i);
}

 

여는 괄호가 들어올 경우 스택에 추가하고 닫는 괄호가 들어올 경우에는 스택의 사이즈를 확인한다

만약 스택의 사이즈가 0이라면 여는 괄호가 없는 경우이기 때문에 바로 false를 return 하고, 사이즈가 0이 아니라면 현재 비교중인 닫는 괄호와 짝을 이루는 여는 괄호가 있는 경우이므로 스택에서 pop하여 짝을 제거한다

//여는 괄호일 때
if(c == '('){
    stack.push(c);
}

//닫는 괄호일 때
if(c == ')'){
    if(stack.size() == 0){
        return false;
    }
    else stack.pop();
}

 

문자열을 끝까지 확인한 후 스택의 사이즈에 따라 결과값을 return

if(stack.size() != 0) answer = false;

 

최종 코드

import java.util.*;

class Solution {
    boolean solution(String s) {
        boolean answer = true;
        Stack<Character> stack = new Stack<>();
        
        for(int i = 0; i < s.length(); i++){
            char c = s.charAt(i);
            
            //여는 괄호일 때
            if(c == '('){
                stack.push(c);
            }
            
            //닫는 괄호일 때
            if(c == ')'){
                if(stack.size() == 0){
                    return false;
                }
                else stack.pop();
            }
        }
        if(stack.size() != 0) answer = false;

        return answer;
    }
}