닫는 괄호는 아직 열린 괄호와 짝을 지어요
앞 레슨에서 스택의 top·pop을 읽었어요. 이번에는 괄호 문자열을 처음부터 확인해요. 여는 괄호 (를 읽으면 미완료 상태로 넣고, 닫는 괄호 )를 읽으면 마지막으로 열린 괄호 하나를 닫아요.
(()는 두 개 열고 하나만 닫아서 하나가 남아요. )(는 첫 닫는 괄호에 대응하는 열린 괄호가 없어 그 순간부터 잘못됐어요. 전체 개수만 같다고 올바른 것은 아니에요.
중간 실패와 마지막 미완료를 따로 확인해요
| 읽은 부분 | 아직 열린 괄호 수 |
|---|---|
| ( | 1 |
| (( | 2 |
| (() | 1 |
| (()) | 0 |
마지막이 0이면 모든 괄호가 닫혔어요. 하지만 중간에 빈 스택에서 닫기를 시도한 적이 없어야 해요. 빈 문자열은 열거나 닫을 작업이 없어 올바른 문자열로 정해요.
stack<char>는 문자 한 개를 쌓아요. 조건 ? 참일때값 : 거짓일때값은 두 값 중 하나를 고르는 표현이고, if/else로 같은 계산을 써도 돼요.
직접 풀어봐요
text의 괄호가 올바르게 짝지어졌으면 1, 아니면 0을 반환해요. 앞에서부터 모든 닫는 괄호에는 아직 닫지 않은 여는 괄호가 있어야 하고, 끝에 미완료 여는 괄호가 없어야 해요. 빈 문자열은 1이에요.
text는 (와 )만 포함하며 길이는 0~100이에요. 실행용 입력은 text 한 줄이고 빈 입력값은 빈 줄이에요. 출력은 반환값이에요. 하네스는 getline으로 빈 줄까지 읽어요.
예시 1: text="(()())" → 1. 모든 열린 괄호를 알맞은 순서로 닫아요.
예시 2: text="()(()" → 0. 마지막 열린 괄호가 남아요.
예시 입력
(()())
예상 결과
1
예시 입력
()(()
예상 결과
0
핵심 개념
stack-queue: 미완료 괄호와 중간 실패를 스택 상태로 구분해요.