https://www.youtube.com/watch?v=cdjjk-ryPKc
https://github.com/encrypted-def/basic-algo-lecture/blob/master/workbook/0x08.md
STL 스택 이용해서 간단하게 풀 수 있는 문제
진짜 간단한 문제 스택에 A, B를 쌓아가는데 넣을 때 top이 같은 문자면 pop 시킴. 마지막에 스택이 empty여야 좋은 단어
간단한 괄호쌍 문제
스택으로 풀지 않아도 됐던 문제.😲
int main(void) {
ios::sync_with_stdio(0);
cin.tie(0);
string str;
cin >> str;
int cnt = 0;
int res = 0;
for (int i = 0; i < str.length(); ++i) {
if (str[i] == '(') {
++cnt;
} else if (str[i] == ')') {
--cnt;
if (str[i - 1] == '(') {
res += cnt;
} else {
++res;
}
}
}
cout << res;
}
어떻게 풀었었더라.. 아 사진을 보면 (
하나당 막대의 나눠진 부분 하나가 된다는 것을 알 수 있음. 그래서 ++cnt
를 하다가
)
를 만나면 레이저거나 막대가 끝난다는 뜻이기 때문에 --cnt
를 해줌
이 때 이전 문자가 (
면 레이저이기 때문에 해당 레이저를 기준으로 나눠진 왼쪽 막대들의 합인 cnt
를 res
에 더해줌
이전 문자가 (
가 아니라면 그건 막대가 끝나는 부분을 뜻함. 막대가 나눠진 부분 중 끄트머리만 안 더해진 상태이므로 ++res
를 해줌
오오 골드 첨 맞춰봐~~
답안에 비하니까 난 살짝 더 복잡하게 풀긴 했다.
어쨌든 핵심은 여는 괄호
면 multi를 계속 곱해가다가 여는괄호+닫는괄호
조합이 나오면 곱해왔던 multi를 res에 더해주는데 이 때 div로 나눠주고 더해줌.
div는 괄호쌍이 pop될 때마다 곱해줌.
int main(void) {
ios::sync_with_stdio(0);
cin.tie(0);
string str;
cin >> str;
int multi = 1, div = 1, res = 0;
bool close = false;
stack<char> s;
for (auto c : str) {
if (c == '(' || c == '[') {
if (close) {
res += multi;
multi /= div;
div = 1;
}
c == '(' ? multi *= 2 : multi *= 3;
close = false;
s.push(c);
} else {
if (s.empty()) {
res = 0;
multi = 0;
break;
}
close = true;
if (c == ')' && s.top() == '(') {
div *= 2;
s.pop();
} else if (c == ']' && s.top() == '[') {
div *= 3;
s.pop();
} else {
res = 0;
multi = 0;
break;
}
}
}
res += multi;
if (!s.empty()) res = 0;
cout << res;
}
유익한 글이었습니다.