본문 바로가기

알고리즘/프로그래머스

[프로그래머스]Lv.2 올바른 괄호

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

 

프로그래머스

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

programmers.co.kr


문제

  • 괄호가 바르게 짝지어졌다는 것은 '(' 문자로 열렸으면 반드시 짝지어서 ')' 문자로 닫혀야 한다는 뜻입니다.
  • 예를 들어
  • "()()" 또는 "(())()" 는 올바른 괄호입니다.
  • ")()(" 또는 "(()(" 는 올바르지 않은 괄호입니다.
  • '(' 또는 ')' 로만 이루어진 문자열 s가 주어졌을 때, 문자열 s가 올바른 괄호이면 true를 return 하고, 올바르지 않은 괄호이면 false를 return 하는 solution 함수를 완성해 주세요.

제한사항

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

출력 예제

설계과정

1. 입력받은 문자열을 하나의 문자들로 자른다.

 

2. '(' 가 입력되면 스택에 넣고 ')' 가 입력되면 스택에서 뺀다.

 

3. '(' 혹은 ')' 가 홀로 남아있을 경우에 answer 를 false 로 처리해준다.

 

3. 결과를 출력한다.

 

이전에 풀었던 문제라 쉽게 풀었다.

[백준 알고리즘 자바] 9012 : 괄호 (tistory.com)

 

[백준 알고리즘 자바] 9012 : 괄호

https://www.acmicpc.net/problem/9012 9012번: 괄호 괄호 문자열(Parenthesis String, PS)은 두 개의 괄호 기호인 ‘(’ 와 ‘)’ 만으로 구성되어 있는 문자열이다. 그 중에서 괄호의 모양이 바르게 구성된 문자열

silverji.tistory.com


풀이과정

1. 스택을 선언하고, for 문을 통해 입력받은 문자열을 하나씩 잘라 비교한다.

  • charAt(i) : String 형으로 저장된 문자열 중에서 한 글자만 선택해서 char 타입으로 변환해준다.
  • char 형이 아니라 String 형으로 자르면 `java.util.regex.patternsyntaxexception : unclosed group near index ...` 에러가 발생한다. 이는 "(" 를 문자가 아니라 특수문자로 인식하는 것인데, 이를 방지하기 위해 char 형으로 처리한다.

2. 잘린 문자가 ' ( ' 라면 스택에 넣고 ' ) ' 라면 스택에서 꺼낸다. 

  • ' ( ) ' 를 한 세트로 묶어서 올바른 괄호가 만들어지면 스택에서 꺼내기 위한 작업이다.

3. 만약 ' ( ' 가 없는데 ' ) ' 가 입력되었다면 올바른 괄호가 아니므로 false를 출력한다.

 

4. 탐색이 끝났는데 스택에 무언가가 남아있다면 false를 출력한다.

 

5. 결과를 출력한다.


답안소스

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++) {
			if(s.charAt(i) == '(') {
				stack.push('(');
			} else {
				if(stack.isEmpty()) return false;
				
				stack.pop();
			}
		}
		
		if(!stack.isEmpty()) return false;

        return answer;
    }
}