문제 보기
https://school.programmers.co.kr/learn/courses/30/lessons/12909
문제
괄호가 바르게 짝지어졌다는 것은 '(' 문자로 열렸으면 반드시 짝지어서 ')' 문자로 닫혀야 한다는 뜻입니다. 예를 들어
- "()()" 또는 "(())()" 는 올바른 괄호입니다.
- ")()(" 또는 "(()(" 는 올바르지 않은 괄호입니다.
'(' 또는 ')' 로만 이루어진 문자열 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 링크
'ProblemSolve' 카테고리의 다른 글
[프로그래머스][Java] JadenCase 문자열 만들기 - level 2 (0) | 2024.04.30 |
---|---|
[프로그래머스][Java] 최솟값 만들기 - level 2 (0) | 2024.04.30 |
[프로그래머스][Java] 최댓값과 최솟값 - level 2 (0) | 2024.04.30 |
[프로그래머스][Java] [PCCE 기출문제] 9번 / 이웃한 칸 - level 1 (1) | 2024.04.26 |
[프로그래머스][Java] [PCCP 기출문제] 1번 / 붕대 감기 - level 1 (0) | 2024.04.26 |