작성
·
285
0
```
#include <bits/stdc++.h>
using namespace std;
bool check(string s) {
stack<char> stk;
bool flag;
for(char c: s) {
if(c == '(' || c == '[') stk.push(c);
else {
if(c == ')') {
if(!stk.size() || stk.top() != '(') {
flag = true;
break;
}
else stk.pop();
}
else if(c == ']') {
if(!stk.size() || stk.top() != '[') {
flag = true;
break;
}
else stk.pop();
}
}
}
if(stk.size() || flag) return false;
else return true;
}
int main() {
/*ios_base::sync_with_stdio(false);
cin.tie(NULL); cout.tie(NULL); */
while(true) {
string s;
getline(cin, s);
if(s == ".") break;
if(check(s)) cout << "yes\n";
else cout << "no\n";
}
return 0;
}
```
위의 코드로 제출하면 20%에서 틀렸다고 뜹니다.
하지만 백준 질문검색에서 찾은 반례들을 넣어도 알맞게 출력해서 질문글 올립니다.
답변 1
1
안녕하세요. ㅎㅎ
먼저 굉장히 코드를 잘 짜셨네요. ㅎㅎ
but, 제가 교안에서 뭐라고 했죠?
지역변수로 선언을 하면 "쓰레기값"이 들어간다고 말씀을 드렸죠?
bool check(string s) {
stack<char> stk;
bool flag;
for(char c: s) {
이 코드에서 bool flag는 false가 아닌 true가 들어갈 수도 있기 때문에 틀렸다고 나타나게 됩니다.
쓰레기 값으로 인한 UB, Unexpected Behavior가 나타난 것이죠.
이러한 "반복해서" 로직을 하는 문제는 반드시 "초기화"를 잘해주셔야 해요.
감사합니다.
강사 큰돌 올림.
답변 감사합니다!