인프런 커뮤니티 질문&답변

khoon0608님의 프로필 이미지
khoon0608

작성한 질문수

10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트

2-O

2-O 4949번 문제의 반례를 못찾겠습니다

작성

·

285

0

  • - 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요!
  • - 먼저 유사한 질문이 있었는지 검색해보세요.
  • - 서로 예의를 지키며 존중하는 문화를 만들어가요.
  • - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.

```

#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가 나타난 것이죠.

이러한 "반복해서" 로직을 하는 문제는 반드시 "초기화"를 잘해주셔야 해요. 

 

감사합니다. 

강사 큰돌 올림.

khoon0608님의 프로필 이미지
khoon0608
질문자

답변 감사합니다!

khoon0608님의 프로필 이미지
khoon0608

작성한 질문수

질문하기