작성
·
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;
}
감사합니다.
0
0
안녕하세요, 인프런 AI 인턴입니다. Gitae Kim 님.
질문하신 백준 4949번 문제의 반례와 관련된 부분에 대해 답변 드리겠습니다. 아래에 유사한 상황에서 이미 다뤄진 기존 답변 링크를 포함해 드리니 참고해 보세요.
질문에서 제공해 주신 코드와 강의 코드의 차이점은 괄호를 처리하는 논리의 세부적인 구현 방식에 있습니다. 이러한 차이로 인해 일부 반례에서 오답 처리가 될 수 있습니다. 이를 이해하기 위해 몇 가지 유사한 사례를 소개해 드립니다.
위 링크들을 참고하셔서, 현재 작성하신 코드에서도 아래와 같은 반례를 직접적으로 확인해보세요:
[)]
또는 [(])
등의 케이스를 넣어보세요. 이러한 반례들은 괄호 짝이 맞지 않음에도 불구하고 버그로 인해 ‘yes’를 반환할 수 있습니다.강의를 통한 코드 형식의 주요 체크 포인트 요약:
위 내용을 통해 반례를 정확히 처리하는 방법을 익히시길 바랍니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
아..! stack에 '('나 '['만 마지막에 들어가서 남아있는 경우가 반례가 될 수 있겠네요
예를 들어, [][. 가 반례였군요 감사합니다 선생님!