괄호가 바르게 짝지어졌다는 것은 '(' 문자로 열렸으면 반드시 짝지어서 ')' 문자로 닫혀야 한다는 뜻입니다. 예를 들어
'(' 또는 ')' 로만 이루어진 문자열 s가 주어졌을 때, 문자열 s가 올바른 괄호이면 true를 return 하고, 올바르지 않은 괄호이면 false를 return 하는 solution 함수를 완성해 주세요.
이 문제는 사실 스택으로 풀라고 되어있는 문제이지만, 그냥 완전 탐색으로도 풀 수 있는 문제이다.
입력된 문자열에서 여는 괄호와 닫는 괄호의 개수를 세어 나가면서, 닫는 괄호의 개수가 더 많아지면, 올바른 괄호가 아니다.
또한 문자열 탐색이 끝난 시점에서 둘의 개수가 다르면 올바른 괄호가 아닌 것이다.
class Solution {
boolean solution(String s) {
int openCount = 0;
int closeCount = 0;
for (int i = 0; i < s.length(); i++) {
if (s.charAt(i) == '(') {
openCount++;
} else if (s.charAt(i) == ')') {
closeCount++;
}
if (openCount < closeCount) {
return false;
}
}
if (openCount == closeCount) {
return true;
}
return false;
}
}
사실 위 코드도 상당히 직관적이고 효율적인 코드라 생각한다.
스택으로도 한번 풀어보자
import java.util.*;
class Solution {
boolean solution(String s) {
Stack<Character> stack = new Stack<>();
for (int i = 0; i < s.length(); i++) {
if (s.charAt(i) == '(') {
stack.push('(');
} else if (s.charAt(i) == ')') {
if (stack.isEmpty()) {
return false;
}
stack.pop();
}
}
return stack.isEmpty();
}
}
아마 stack에 괄호가 아닌 true false나 0 or 1 을 사용했다면 좀 더 빠른 결과가 나오려나..? 싶은데 별로 중요한 것 같진 않다.
너무 깔끔하네요 한수 배우고 갑니다!