티스토리 뷰
1. 수식의 괄호 쌍이란?
스택은 여러 문제 유형에서 활용이 됨. 대표적으로 수식의 괄호 쌍, 전위/중위/후위 표기법, DFS(깊이 우선 탐색), Flood Fill이 있음. 이 중 전위/중위/후위 표기법은 코테에서는 너무 지엽적인 부분이므로 해당 강의에서는 다루지 않을 예정!
수식의 괄호 쌍의 정의
주어진 괄호 문자열이 올바르게 매치가 되는 지 판단하는 문제.
2. 문제 해결을 위한 관찰
'올바르게 매칭'를 한다는 것은 각 괄호가 짝이 맞을 때를 의미함. 하지만 하나의 괄호만 사용이 된다면 단순히 여는 괄호의 갯수 = 닫는 괄호 갯수이면 되겠지만, 여러 종류의 괄호가 사용이 된다면 닫힌 괄호가 들어왔을 때 가장 최근에 들어온 여는 괄호와 종류가 같아야 한다는 조건을 붙여야 함.
정리하자면!
문자열을 앞에서부터 일어나갈 때, 닫는 괄호는 남아있는 괄호 중에서 가장 최근에 들어온 여는 괄호와 짝을 지어 없애버리는 명령이라고 생각해도 된다.🤩
3. 문제 해결 방법
스택의 FILO 성질을 이용하면 이를 구현할 수 있음. 자세한 해결 방법은 아래와 같음.
4. 연습 문제
백준 4949번 문제가 수식의 괄호 쌍 문제 예시!
(왜인지 모르겠지만 내 코드는 계속 에러가 나므로 추후 맞게 된다면 추가해보도록 하겠다.. ㅎㅎ..)
#include <bits/stdc++.h>
using namespace std;
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
while(true){
string a;
getline(cin, a);
if(a == ".") break;
stack<char> s;
bool isValid = true;
for(auto c : a){
if(c == '(' || c == '[') s.push(c);
else if(c == ')'){
if(s.empty() || s.top() != '('){
isValid = false;
break;
}
s.pop();
}
else if(c == ']'){
if(s.empty() || s.top() != '['){
isValid = false;
break;
}
s.pop();
}
}
if(!s.empty()) isValid = false;
if(isValid) cout << "yes\n";
else cout << "no\n";
}
}
'🥞 Algorithm > Algorithm-squirrels 스터디' 카테고리의 다른 글
[바킹독의 실전 알고리즘] 0x0A강 - DFS (1) | 2023.02.05 |
---|---|
[바킹독의 실전 알고리즘] 0x09강 - BFS (0) | 2023.02.02 |
[바킹독의 실전 알고리즘] 0x07강 - 덱 (1) | 2023.02.02 |
[바킹독의 실전 알고리즘] 0x06강 - 큐 (0) | 2023.02.01 |
[바킹독의 실전 알고리즘] 0x05강 - 스택 (0) | 2023.02.01 |
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- Subnet
- 로컬스토리지
- 면접을 위한 CS 전공지식 노트
- IGW
- react
- VPC
- 쿠키
- ceos
- AWS
- DOM
- route table
- 이분탐색
- 바리바리
- refresh token
- 세오스
- 리액트를 다루는 기술
- 프론트엔드
- JWT 토큰
- 그리디
- access token
- 정렬
- vpc peering
- 로그인 기능 구현
- TypeScript
- AwsCloudClubs
- jwt
- NaCl
- cloud
- 리액트
- 투포인터
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
글 보관함