Coding Test/LeetCode
20. Valid Parentheses
JTB
2025. 10. 22. 13:48
난이도: 쉬움 (Easy)
링크: LeetCode 20 — Valid Parentheses
풀이 날짜: 2025/10/22
1. 문제 이해
입력:
s = "()[]{}"
출력:
true
괄호로 구성된 문자열이 주어질 때, 올바르게 짝이 맞는지 판단하는 문제다. 모든 열린 괄호는 같은 종류의 닫힌 괄호로 닫혀야 하며, 올바른 순서로 닫혀야 한다.
| 입력 | 결과 | 이유 |
| "()" | true | 괄호 짝이 맞음 |
| "()[]{}" | true | 여러 종류의 괄호가 올바르게 닫힘 |
| "(]" | false | 서로 다른 괄호가 짝지어짐 |
| "([)]" | false | 괄호 순서가 잘못됨 |
| "{[]}" | true | 중첩 구조로도 올바르게 닫힘 |
2. 접근 방식 — Stack (스택)
이 문제는 스택 자료구조의 대표적인 응용 문제다.
핵심 아이디어:
- 열린 괄호는 스택에 push한다.
- 닫힌 괄호가 등장하면, 스택의 top을 pop해서 짝이 맞는지 확인한다. -> 짝이 맞지 않으면 바로 false 리턴한다.
- 전부 확인했을 때 스택이 비어 있으면 유효한 문자열이다. -> 잘못된 예시로, 열린 괄호만 입력으로 주어진 경우 for 구문은 통과하지만 스택이 비어있지 않은 상태(닫히지 않은 상태)이므로 false 이다.
3. 풀이 코드
/**
* @param {string} s
* @return {boolean}
*/
var isValid = function(s) {
if (s.length % 2 === 1) return false; // 홀수 길이는 무조건 false
const stack = [];
const pMap = {
'(': ')',
'{': '}',
'[': ']'
};
for (let char of s) {
if (pMap[char]) {
stack.push(char); // 여는 괄호 → push
} else {
const popped = stack.pop(); // 닫는 괄호 → 이전 괄호 pop
if (pMap[popped] !== char) return false; // 짝이 맞지 않으면 false
}
}
return stack.length === 0; // 모든 괄호가 닫혀야 함
};
| 구분 | 복잡도 | 설명 |
| 시간 복잡도 | O(N) | 문자열을 한 번 순회 |
| 공간 복잡도 | O(N) | 스택에 최대 N개의 괄호가 쌓일 수 있음 |
4. 핵심 정리
| 개념 | 설명 |
| 문제 유형 | Stack, String Parsing |
| 핵심 아이디어 | 열린 괄호 → push, 닫힌 괄호 → pop 후 매칭 확인 |
| 시간 복잡도 | O(N) |
| 공간 복잡도 | O(N) |
| 포인트 | 괄호 문제의 기본 구조는 항상 스택으로 접근한다. |
이 문제는 스택의 기본 원리를 정확히 이해하고 있다면 매우 깔끔하게 해결된다. 괄호 짝 문제뿐만 아니라, 나중에 배우게 될 수식 평가, HTML 태그 검증, 파서 구현 등에서도 동일한 패턴이 등장한다.