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

wldls317님의 프로필 이미지
wldls317

작성한 질문수

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

1-G

백준9996번 질문드립니다.

작성

·

71

0

#include <bits/stdc++.h>


using namespace std;



int num;
string pattern;
string fileName;
int asteridIndex=0;

int isValid;

vector<char> patternFront;
vector<char> patternBack;
vector<string> output;

int checkValid(string fileName){
    
 
    string fileNameReverse;
    fileNameReverse=fileName;
    reverse(fileNameReverse.begin(),fileNameReverse.end());
    
       for(size_t i = 0; i<patternFront.size(); i++){
       if(fileName[i]==patternFront[i])continue;
       else{return 0;}
       
   }

   for(size_t i = 0; i<patternBack.size(); i++){
       if(fileNameReverse[i]==patternBack[i])continue;
       else{return 0;}
       
   }
   
   return 1;

 
}



int main()
{
    



cin>>num;
cin>>pattern;





for(size_t i=0; i<pattern.size(); i++){
    
    if(pattern[i]=='*'){asteridIndex=i; 
    continue; // 이번껀 패턴으로 저장 안하고, 다음 문자로 넘어가기 위해
    }
    if(asteridIndex==0){
        patternFront.push_back(pattern[i]);
    }else if(asteridIndex!=0){
          patternBack.insert(patternBack.begin(), pattern[i]);
    }
        
    }
    
    
   for(int i = 0; i<num; i++){
    cin>>fileName;
   isValid=checkValid(fileName);
   if(isValid==0){output.push_back("NE");}
   else if(isValid==1){output.push_back("DA");}
   }
  
  
  for(auto o:output){cout<<o<<"\n";}
      
  
    



    return 0;
}

입력 -> 출력은 알맞게 되는데 백준에선 계속 틀렸습니다가 나옵니다.

답변 2

1

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

안녕하세요 ㅎㅎ

제가 수강생님 코드 기반으로 해서 다듬어봤는데요. 이렇게 고치시면 됩니다.

#include <bits/stdc++.h>

using namespace std;

int num;
string pattern;
string fileName;
int asteriskIndex = -1;

vector<char> patternFront;
vector<char> patternBack;
vector<string> output;

bool checkValid(const string& fileName) {
    if (asteriskIndex == -1) {
        return fileName == pattern;
    }
    
    if (fileName.size() < patternFront.size() + patternBack.size()) {
        return false;
    }
    
    for (size_t i = 0; i < patternFront.size(); i++) {
        if (fileName[i] != patternFront[i]) {
            return false;
        }
    }
    
    for (size_t i = 0; i < patternBack.size(); i++) {
        if (fileName[fileName.size() - patternBack.size() + i] != patternBack[i]) {
            return false;
        }
    }
    
    return true;
}

int main() {
    cin >> num;
    cin >> pattern;

    asteriskIndex = pattern.find('*');

    for (size_t i = 0; i < asteriskIndex; i++) {
        patternFront.push_back(pattern[i]);
    }
    for (size_t i = asteriskIndex + 1; i < pattern.size(); i++) {
        patternBack.push_back(pattern[i]);
    }

    for (int i = 0; i < num; i++) {
        cin >> fileName;
        bool isValid = checkValid(fileName);
        if (isValid) {
            output.push_back("DA");
        } else {
            output.push_back("NE");
        }
    }

    for (const auto& o : output) {
        cout << o << "\n";
    }

    return 0;
}

 

그리고 다음 질문 때는 들여쓰기좀 부탁드립니다 ㅠㅠ 디버깅하는데 힘들었습니다.. ㅠㅠ


 

또 질문 있으시면 언제든지 질문 부탁드립니다.

좋은 수강평과 별점 5점은 제게 큰 힘이 됩니다. :)

감사합니다.

강사 큰돌 올림.


 

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

앗 지금 확인했네요 ㅠㅠ 이후에도 들여쓰기 안한상태로 여러개 올렸는데 죄송하네요 ㅠㅠ

알겠습니다 다음엔 들여쓰기해서 질문 올리겠습니다!

0

안녕하세요, 인프런 AI 인턴입니다. wldls317님, 문의하신 백준 9996번 문제와 관련하여 비슷한 상황에서 질문을 하셨던 다른 수강생 분의 경우와 해당 질문에 대한 지식공유자님의 답변을 참조하여 도움을 드리고자 합니다.

백준 9996번 한국이 그리울 땐 서버에 접속하지 문제는 패턴 매칭 문제로, ‘’ 문자를 활용하여 문자열의 시작 부분과 끝 부분이 주어진 패턴과 일치하는지 여부를 확인하는 문제입니다. 질문하신 코드의 로직을 간단히 살펴보면, ‘’ 문자를 기준으로 패턴을 앞부분(patternFront)과 끝부분(patternBack)으로 나누어 입력받은 fileName이 해당 패턴과 일치하는지 검사하는 함수(checkValid)를 구현하셨네요.

다만, 이 문제를 해결할 때 주의해야 할 점 중 하나는 ‘*’ 문자를 기준으로 패턴을 나눈 뒤, 입력받은 문자열(fileName)이 패턴의 앞부분과 끝부분에 정확하게 일치하는지 확인해야 하며, 중간에 어떤 문자가 와도 상관없지만, 패턴의 앞부분과 끝부분이 입력 문자열에 정확히 위치해야 한다는 것입니다.

실제 코드에서 실수하기 쉬운 부분은 반드시 전체 패턴 길이(별표 포함)와 입력 문자열 길이를 고려하여 패턴이 입력 문자열 안에 적절히 위치할 수 있는지 확인해야 하며, 패턴의 뒷부분 매치를 확인할 때 패턴과 입력 문자열의 뒤에서부터 일치하는지 확인해야 합니다.

지금까지의 설명과 비슷한 상황에서 질문하셨던 다른 수강생 분들의 경우가 있었으며, 아래는 해당 질문과 관련된 피드백 링크입니다:

이 답변들에서는 반례와 코드 분석을 기반으로 수정해야할 부분에 대한 구체적인 조언이 제시되어 있습니다. 비록 정확한 코드 구현 방법이나 로직은 달라질 수 있지만, 해당 내용들을 통해 문제의 이해를 깊게 하고 코드의 오류를 찾는데 도움이 될 수 있을 것입니다.

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

wldls317님의 프로필 이미지
wldls317

작성한 질문수

질문하기