💡 문제
괄호가 바르게 짝지어졌다는 것은 '(' 문자로 열렸으면 반드시 짝지어서 ')' 문자로 닫혀야 한다는 뜻입니다. 예를 들어
- "()()" 또는 "(())()" 는 올바른 괄호입니다.
- ")()(" 또는 "(()(" 는 올바르지 않은 괄호입니다.
'(' 또는 ')' 로만 이루어진 문자열 s가 주어졌을 때, 문자열 s가 올바른 괄호이면 true를 return 하고, 올바르지 않은 괄호이면 false를 return 하는 solution 함수를 완성해 주세요.
제한사항
- 문자열 s의 길이 : 100,000 이하의 자연수
- 문자열 s는 '(' 또는 ')' 로만 이루어져 있습니다.
입출력 예
s | answer |
"()()" | true |
"(())()" | true |
")()(" | false |
"(()(" | false |
📍 참조링크
https://programmers.co.kr/learn/courses/30/lessons/12909
코딩테스트 연습 - 올바른 괄호
괄호가 바르게 짝지어졌다는 것은 '(' 문자로 열렸으면 반드시 짝지어서 ')' 문자로 닫혀야 한다는 뜻입니다. 예를 들어 "()()" 또는 "(())()" 는 올바른 괄호입니다. ")()(" 또는 "(()(" 는 올바르지 않은
programmers.co.kr
import java.util.Stack;
class Solution {
boolean solution(String s) {
boolean answer = true;
Stack<Character> stack = new Stack<Character>();
for(int i = 0; i < s.length(); i++) {
char ch = s.charAt(i);
if(ch == ')') {
if(stack.isEmpty()) {
answer = false;
break;
} else {
stack.pop();
}
} else {
stack.push(ch);
}
}
if(!stack.isEmpty()) answer = false;
return answer;
}
}
📝 해결
1. stack은 '('를 담는 용도로 생성한다.
2. s의 글자 수 만큼 for문을 돌린다.
3. i번째의 문자가 '('일 경우 stack에 담고, ')'인 경우 stack에 담긴 '(' 하나를 삭제한다.
4. 기준에 충족하지 못하는 경우는 answer이 false를 반환하도록 한다.
[ 기준에 충족하지 못하는 경우 ]
- stack의 값이 비어있는데 문자가 ')'인 경우 -> ')'를 확인하는 if문에서 if~else 분기 작성
- stack의 값이 남아있는데 for문이 종료될 경우 -> for문 종료 후 stack값 확인하는 if문 작성
원래 반복문을 돌리면서 괄호를 지워나가는 방법으로 작성했었는데 효율성에서 실패하는 바람에
한 번 엎고 다시 작성한 경우였다. 같은 결과의 코드를 2개의 방법으로 작성해보니 코드를 가볍게 작성하는 요령이 중요함을 몸소 깨달았다. 자료구조와 알고리즘 학습이 필수라는 것도,,,