[ Programmers ] 올바른 괄호 (Java)

1. Problem 📃

[ 올바른 괄호 ]

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


[ 문제 설명 ]

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

예를 들어

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


2. Constraint 🔗

[ 제한 사항 ]

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

3. Example 📚

[ 입출력 예시 ]

sanswer
"()()"true
"(())()"true
")()("false
"(()("false

4. Solution 🔑

[ Stack을 이용하지 않은 풀이 ]

  1. 괄호를 열어주는 문자가 들어오면 수를 세어줄 변수(ph : ParentHesis)를 하나 선언하여 0으로 초기화한다.

  2. 괄호를 여는 문자( '(' )가 들어오면 변수 ph를 증가(++)시킨다. 괄호를 닫는 문자( ')' )가 들어오면 ph변수를 감소(--)시킨다.
    감소시키기전, ph변수가 0값 (비어있음)이라면 answer을 false값으로 변경하고 break;한다.

  3. 최종적으로 ph변수가 비어있지 않으면 answer을 false값으로 변경하여준다.

  4. answer변수를 반환한다.

[ Stack을 이용한 풀이 ]

Stack이라는 개념을 배우고 Stack을 이용해보았다.


1. 스택(stack)을 하나 선언한다.


2. 입력되는 문자열을 toCharArray()로 한 문자씩 받으면서
스택(stack)이 비어있는 상태에서 닫는 문자( ')' )가 들어오면 answer을 false값으로 변경하여 break; 하거나 return해준다.
여는 문자( '(' )가 들어오면 stack에 push를 이용하여 집어넣고,
비어있지 않은 상태에서 닫는 문자( ' ) ' )가 들어오면 stack에 있던 여는 문( ' ( ' ) )를 pop하여 빼준다.


3. 마지막에 스택(stack)이 비어있지 않으면 answer을 false값으로 변경하여준다.


4. answer변수를 반환한다.

5. Code 💻

[ Stack을 이용하지 않은 풀이 ]

class Solution {
    boolean solution(String s) {
        boolean answer = true;
        int ph = 0;
        for(char h : s.toCharArray()) {
        	if(h=='(') {
        		ph++;
        	}
        	if(h==')') {
        		if(ph == 0) {
        			answer = false;
        			break;
        		}
        		ph--;
        	}
        }
        if(ph != 0) {
        	answer = false;
        }
        return answer;
    }
}

[ Stack을 이용한 풀이 ]

import java.util.Stack;

class Solution {
    boolean solution(String s) {
        boolean answer = true;
        
        Stack<Character> stack = new Stack<Character>();
        
        for(char p : s.toCharArray()) {
        	if(stack.isEmpty() && p == ')') {
        		answer = false;
        		break;
        	}
        	else {
        		if(p==')') {
        			stack.pop();
        		}
        		else {
        			stack.push(p);
        		}
        	}
        }
        
        if(!stack.isEmpty()) {
        	answer = false;
        }

        return answer;
    }
}

6. Growth 🍄

Stack 개념을 배우고 풀어보니 어떤 유형을 Stack으로 풀면 될지 좀 더 이해가 갔다.
시간은 스택을 이용하여 푸는 방법보다 이용하지 않은 방법이 훨씬 더 빨랐다.
아마 위에는 기본 연산으로만 스택과 비슷한 상태로 풀어서 그런듯하다.

좋은 웹페이지 즐겨찾기