학습 목표: 괄호·취소·대기열 문제에서 LIFO와 FIFO 중 맞는 구조를 선택합니다. 모든 예시는 주어진 매개변수를 처리해 정답을 반환하는 solution 함수로 완성합니다.
문제를 푸는 기준
최근 상태로 되돌아가면 스택, 대기 순서대로 처리하면 큐를 떠올립니다. 큐는 head 인덱스를 두어 앞 원소 삭제 비용을 피합니다.
핵심 개념
| 개념 | 코딩테스트에서의 역할 |
|---|---|
| 스택 | 가장 나중에 넣은 값을 먼저 꺼냅니다. |
| 큐 | 가장 먼저 넣은 값을 먼저 꺼냅니다. |
| head 인덱스 | shift 대신 읽을 위치를 늘려 큐를 소비합니다. |
대표 문제
괄호 문자열 검사
소괄호·대괄호·중괄호 문자열 text가 올바르게 열리고 닫히면 true, 아니면 false를 반환하세요.
함수 시그니처: solution(text)
제한사항
- text의 길이는 0 이상 200,000 이하입니다.
- text에는 괄호 문자만 들어 있습니다.
입출력 예
| 매개변수 | 반환값 |
|---|---|
([]{}) | true |
([)] | false |
풀이 설계
- 여는 괄호는 스택에 넣습니다.
- 닫는 괄호에서 스택 꼭대기의 짝을 확인합니다.
- 모든 문자 뒤 스택이 비었는지 반환합니다.
JavaScript 풀이
function solution(text) {
const stack = [];
const opening = new Set(['(', '[', '{']);
const pair = { ')': '(', ']': '[', '}': '{' };
for (const char of text) {
if (opening.has(char)) stack.push(char);
else if (stack.pop() !== pair[char]) return false;
}
return stack.length === 0;
}복잡도
- 시간복잡도:
O(n) - 공간복잡도:
O(n) - 핵심 패턴: 여는 기호를 쌓고 닫는 기호에서 짝 확인
- 경계 사례: 닫는 괄호가 먼저 나오거나 여는 괄호가 남으면 false
연습 문제
1. 문자 지우기
별표마다 바로 앞 문자를 지운 결과를 반환하세요.
힌트
문자 스택
2. 작업 대기열
처리 시간으로 완료 순서를 반환하세요.
힌트
head 인덱스 큐
3. 다음 큰 값
오른쪽 첫 큰 값을 반환하세요.
힌트
인덱스 단조 스택
자주 하는 실수
- 빈 스택에서 닫는 괄호를 처리하지 않는 실수
- 마지막 스택 길이를 확인하지 않는 실수
- 큐에서 shift를 반복하는 실수
- 인덱스가 필요한 문제에서 값만 저장하는 실수
핵심 정리
- 함수 시그니처와 반환 자료형을 먼저 확정합니다.
- 제한사항으로 가능한 시간복잡도를 판단합니다.
- 예시와 경계 사례를 손으로 추적한 뒤 구현합니다.
- 완성한
solution함수가 입력을 불필요하게 바꾸지 않는지도 확인합니다.
확인 문제
문제 14지선다
가장 최근에 열린 괄호와 현재 닫는 괄호를 비교할 구조는?
문제 24지선다
대표 문제의 시간복잡도로 알맞은 것은?
문제 34지선다
괄호 문자열 검사에서 사용한 핵심 패턴은?
문제 44지선다
대표 문제에서 반드시 확인할 경계 사례는?
문제 54지선다
이 과정의 정답 코드가 지켜야 할 계약은?
참고 자료
Last updated on