https://leetcode.com/problems/valid-parentheses/description/
[문제]
Given a string s containing just the characters '(', ')', '{', '}', '[' and ']', determine if the input string is valid.
An input string is valid if:
- Open brackets must be closed by the same type of brackets.
- Open brackets must be closed in the correct order.
- Every close bracket has a corresponding open bracket of the same type.
Example 1:
Input: s = "()"
Output: true
Example 2:
Input: s = "()[]{}"
Output: true
Example 3:
Input: s = "(]"
Output: false
Constraints:
- 1 <= s.length <= 104
- s consists of parentheses only '()[]{}'.
올바른 괄호 형식인지 검사하는 문제로 스택(Stack)을 이용하는 대표적인 알고리즘 문제 중 하나이다.
풀이 방법
- 빈 스택을 한 개 정의한다.
- 입력받은 String을 character 별로 순회한다.
- 만약 현재의 character가 여는 괄호라면 스택에 push한다.
- 아니라면, (닫는 괄호라면) 스택이 비어있는지 확인한다. 비어있을 경우 닫는 괄호와 매칭되는 여는 괄호가 없다는 뜻이므로 false를 반환한다. 비어있지 않을 경우 top 원소를 pop 시킨 후 닫는 괄호와 매칭되는 여는 괄호인지 확인한다. 아니라면 false를 반환한다.
- String을 전부 돈 후 스택이 비어있을 경우 true를 반환, 아니라면 false를 반환한다.
복잡도
시간 복잡도 : O(n), n이 string의 길이라고 했을 때 하나씩 돌며 상수 시간 동작을 수행하기 때문에.
공간 복잡도 : O(n), 최악의 경우 n이 전부 push 되므로
[코드]
public boolean isValid(String s) {
Stack<Character> stack = new Stack<Character>();
for (char c : s.toCharArray()) {
if (c == '(')
stack.push(')');
else if (c == '{')
stack.push('}');
else if (c == '[')
stack.push(']');
else if (stack.isEmpty() || stack.pop() != c)
return false;
}
return stack.isEmpty();
}
나는 여는 괄호라면 ('(' or '{' or '[') stack에 해당 값을 push 하고 나중에 pop한 후 (이면 )인지, {라면 }인지 하나 하나 직접 비교하며 검증하는 방식으로 풀었다. 위는 더 깔끔하고 쉬운 코드로, 여는 괄호를 만나면 해당 값이 아닌 닫는 괄호를 push해서 나중에 닫는 괄호를 만났을 때 같은 타입의 괄호인지 검증하지 않고 그냥 같은지 아닌지만 검사하면 된다.
'알고리즘' 카테고리의 다른 글
| [백준] 경쟁적 전염 (0) | 2025.02.24 |
|---|---|
| [백준] 연구소 (0) | 2025.02.24 |
| [백준] 특정 거리의 도시 찾기 (0) | 2025.02.24 |
| [프로그래머스] 외벽 점검 (0) | 2025.02.22 |
| 재귀호출 (Recursive Call) (1) | 2024.03.25 |