문제 보기

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

문제

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

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

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

 

 

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

 

 

풀이방법

꽤 많이 볼 수 있는 유형의 문제이다.

괄호는 '('')' 순서대로 한 쌍이 이루어져있다.(무조건 '('가 나와야 ')'가 따라 붙는다.)

그리고 제일 안쪽의 괄호는 '('')'이 연속해서 나와야만 한다.

그래서 stack을 사용해 '('이 나오면 계속 넣고, ')'이 나오면 맨 위에 있는 괄호가 '('일 경우 꺼내는 작업을 반복한다.

여기서 맨 위에 있는 괄호가 '('가 아니거나 비어있을 경우 ')'를 넣는 작업도 잊으면 안 된다.

 

 

전체 코드 & 주석
import java.util.Stack;

class Solution {
    boolean solution(String s) {
        boolean answer = true;

        Stack<Character> stack = new Stack<Character>(); // '(', ')'를 담을 Character 스택
        for(int i = 0; i < s.length(); i++) { // 문자열을 순회하며
            if(s.charAt(i) == '(') { // '('괄호가 나왔을 경우
                stack.push('('); // 무조건 집어 넣는다.
            }
            else if(s.charAt(i) == ')') { // 만약 ')'괄호가 나왔다면
                if(!stack.empty()) { // stack이 비어있지 않고
                    if(stack.peek() == '(') { // 현재 제일 위에 있는 게 '('괄호일 때
                        stack.pop(); // 꺼낸다
                    }
                } else { // stack이 비어있거나 제일 위에 있는 게 '('괄호가 아닐 경우
                        stack.push(')'); // 넣는다.
                    }
            }
        }

        if(!stack.empty()) // 작업 수행 후에도 stack이 비어있지 않다면
            answer = false; // false이다. (위에서 true로 선언되어 있는 상태)

        return answer;
    }
}

 

 

풀이 GitHub 링크

https://github.com/MetroDefro/CodingTest_AutoSave/tree/main/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4/2/12909.%E2%80%85%EC%98%AC%EB%B0%94%EB%A5%B8%E2%80%85%EA%B4%84%ED%98%B8

 

CodingTest_AutoSave/프로그래머스/2/12909. 올바른 괄호 at main · MetroDefro/CodingTest_AutoSave

모든 코딩 테스트 자동 저장. Contribute to MetroDefro/CodingTest_AutoSave development by creating an account on GitHub.

github.com

 

+ Recent posts