쇠막대기의 끝부분과 레이저 포인터를 구분하는 코드가 필요하다.
스택과 입력받은 문자열을 모두 활용해서 푼 문제
#include <iostream>
#include <stack>
using namespace std;
int main()
{
stack <char> st;
string order;
int answer=0;
cin >> order;
st.push(order[0]);
for(int i=1; i<order.length(); i++){
if(order[i]=='('){
st.push('(');
}
else{
if(order[i-1] == '('){
st.pop();
answer+=st.size();
}
else{
st.pop();
answer+=1;
}
}
}
cout << answer;
return 0;
}
열리는 괄호가 들어올 때는 스택에 푸시하며 tmp값을 2배 or 3배처리 해준다. 그 뒤로 닫히는 괄호가 들어올 때 바로 이전 문자가 열린 괄호라면 숫자 2 또는 3이고, tmp값을 곱한 값을 answer에 더해준다.
그뒤로 올바른 입력인 지 아닌 지 스택이 비어있는지를 통해 확인해줌!
런타임 에러로 조금 헤맸다... 스택 top,pop할 때 비어있는 경우 체크 꼭꼭 하기
더 깔끔하게 풀 수 있을 것 같은데 방법을 찾아보자
내 작년 풀이에서는 스택없이 tmp와 문자열 대칭을 통해 풀었다...!
#include <iostream>
#include <stack>
using namespace std;
int main()
{
stack <char> st;
string order;
int answer=0;
int tmp=1;
cin >> order;
st.push(order[0]);
if(order[0]=='(') tmp*=2;
else if(order[0]=='[') tmp*=3;
else {
cout << 0;
return 0;
}
for(int i=1; i<order.length(); i++){
if(order[i]=='('){
st.push(order[i]);
tmp*=2;
}
else if(order[i]=='['){
st.push(order[i]);
tmp*=3;
}
else if(order[i]==')'){
if(st.empty()){
cout << 0;
return 0;
}
else if(st.top()=='('){
if(order[i-1]=='('){
answer+=tmp;
}
st.pop();
tmp/=2;
}
else {
cout << 0;
return 0;
}
}
else{
if(st.empty()){
cout << 0;
return 0;
}
else if(st.top()=='['){
if(order[i-1]=='['){
answer+=tmp;
}
st.pop();
tmp/=3;
}
else {
cout << 0;
return 0;
}
}
}
if(!st.empty() || tmp!=1) answer=0;
cout << answer;
return 0;
}