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

Gitae Kim님의 프로필 이미지
Gitae Kim

작성한 질문수

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

2-O

2-O(#4949) 반례 질문 드립니다.

작성

·

34

0

선생님, 안녕하세요,

 

표제의 문제 반례 질문 있어 문의 드립니다.

http://boj.kr/5d827f3164d441c0aeded891ed97444b

코드는 위와 같습니다. 강의에서 말씀주신 코드와 다른 부분은, 아래와 같이 string에 ')' 또는 ']'에 대한 처리 부분이 조금 다릅니다.

 

[강의 코드]

    if(s[i] == ')') { 
        if(stk.size() == 0 || stk.top() == '['){
            check = false; 
            break; 
        }else{
            stk.pop();
    }

 

[제가 짠 코드(오답)]

        else if(c == ')') {
            if((!stk.empty()) && (stk.top() == '(')) {
                stk.pop();
            }
            else {
                flag = 1;
                break;
            }
        }

이전 글자를 '('이냐 아니냐에 따라 true/false를 판단하는 방식 자체에는 큰 차이가 없어 보이는데,

현재로서는 적절한 반례를 떠올리지 못했습니다.관련되어 힌트를 주실 수 있다면 감사드리겠습니다.

 

감사합니다.

 

답변 3

1

큰돌님의 프로필 이미지
큰돌
지식공유자

안녕하세요 기태님 ㅎㅎ

음.. 저 부분은 맞다고 생각하구요. 다른 부분을 고치셔야 합니다.

제가 기태님 코드를 다듬어봤는데요. 이렇게 해보시겠어요?

 

#include <bits/stdc++.h>
using namespace std;
string s;

int flag;

int main() {
    while (1) {
        stack<char> stk;
        getline(cin, s);
        
        if (s == ".") {
            break;
        }

        for (char c : s) {
            if (c == '(') {
                stk.push(c);
            }
            else if (c == ')') {
                if (!stk.empty() && stk.top() == '(') {
                    stk.pop();
                } else {
                    flag = 1;
                    break;
                }
            }
            else if (c == '[') {
                stk.push(c);
            }
            else if (c == ']') {
                if (!stk.empty() && stk.top() == '[') {
                    stk.pop();
                } else {
                    flag = 1;
                    break;
                }
            }
        }

        if (flag || !stk.empty()) {
            cout << "no\n";
        } else {
            cout << "yes\n";
        }

        s = "";
        flag = 0;
    }

    return 0;
}

 

감사합니다.

Gitae Kim님의 프로필 이미지
Gitae Kim
질문자

아..! stack에 '('나 '['만 마지막에 들어가서 남아있는 경우가 반례가 될 수 있겠네요

예를 들어, [][. 가 반례였군요 감사합니다 선생님!

0

Gitae Kim님의 프로필 이미지
Gitae Kim
질문자

인프런 ai 인턴 분이 말씀하신 [)] 또는 [(]) 를 해결하지 못하네요 참고하여 수정해보겠습니다 감사합니다

0

안녕하세요, 인프런 AI 인턴입니다. Gitae Kim 님.

질문하신 백준 4949번 문제의 반례와 관련된 부분에 대해 답변 드리겠습니다. 아래에 유사한 상황에서 이미 다뤄진 기존 답변 링크를 포함해 드리니 참고해 보세요.

질문에서 제공해 주신 코드와 강의 코드의 차이점은 괄호를 처리하는 논리의 세부적인 구현 방식에 있습니다. 이러한 차이로 인해 일부 반례에서 오답 처리가 될 수 있습니다. 이를 이해하기 위해 몇 가지 유사한 사례를 소개해 드립니다.

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

    • 여기서는 함수 내에서 boolean 변수를 초기화하지 않음으로 인해 발생하는 문제를 소개하고 있습니다. 코드가 스택이 비어 있는 경우를 고려하지 않아 발생하는 문제도 설명합니다.
  2. 4949번 제가 낸 답이 왜 틀렸는지 모르겠습니다

    • 이 답변에서는 ‘]’ 또는 ‘)’ 괄호가 나올 때 스택이 비어 있지 않은지 확인하는 로직을 강조하고 있으며, 이에 대한 중요성을 다루고 있습니다.
  3. 2-O 질문있습니다!

    • 유사한 코드에서 괄호를 처리할 때 스택이 비어 있는지를 체크하는 역할을 설명하며, 정확한 로직을 구성하는 방법에 대해 논의합니다.

위 링크들을 참고하셔서, 현재 작성하신 코드에서도 아래와 같은 반례를 직접적으로 확인해보세요:

  • 예상 반례: [)] 또는 [(]) 등의 케이스를 넣어보세요. 이러한 반례들은 괄호 짝이 맞지 않음에도 불구하고 버그로 인해 ‘yes’를 반환할 수 있습니다.

강의를 통한 코드 형식의 주요 체크 포인트 요약:

  • 불필요한 ‘else’ 블록 사용
  • 스택이 비어 있는지 확인하는 로직
  • 모든 괄호가 정확하게 매칭되는지 최종 검사

위 내용을 통해 반례를 정확히 처리하는 방법을 익히시길 바랍니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

Gitae Kim님의 프로필 이미지
Gitae Kim

작성한 질문수

질문하기