알고리즘 모음(C++)

백준 9996 - 한국이 그리울 땐 서버에 접속하지(C++) 본문

백준

백준 9996 - 한국이 그리울 땐 서버에 접속하지(C++)

공대생의 잡다한 사전 2023. 6. 1. 20:09

문제 링크입니다. https://www.acmicpc.net/problem/9996

 

9996번: 한국이 그리울 땐 서버에 접속하지

총 N개의 줄에 걸쳐서, 입력으로 주어진 i번째 파일 이름이 패턴과 일치하면 "DA", 일치하지 않으면 "NE"를 출력한다. 참고로, "DA"는 크로아티어어로 "YES"를, "NE"는 "NO"를 의미한다.

www.acmicpc.net

패턴이 주어졌을 때, 파일 이름이 패턴과 일치한지 구하는 문제입니다.

패턴은 *을 기준으로 앞과 뒤로 구분이 가능합니다.

 

파일이 이름의 처음과 마지막이 패턴의 앞과 뒤가 일치하면 됩니다.

여기서 중요한 것은 패턴을 확인할 때 중복되면 안된다는 것입니다.

 

예를 들어, 패턴이 ab*bc라고 할 때, abc는 패턴의 앞과 뒤는 같지만, b가 겹치기 때문에 패턴과 일치하지 않습니다.

따라서, 패턴을 확인할 때 어느 지점까지 확인했는지 저장을 해줘야 합니다.

 

처음에 패턴을 입력 받을 때, *을 기준으로 나눠서 구분합니다.

파일 이름을 입력 받은 뒤, 파일의 처음과 패턴의 앞, 파일의 마지막과 패턴의 뒤가 일치하는지 확인해주면 됩니다.

 

 

자세한 것은 코드를 참고해주세요

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <queue>
#include <vector>
#include <cstring>
#include <cmath>

using namespace std;

int N;
string pattern;
string Front, Back;
int flag = 0;
int check[101];

int main(){
    cin.tie(0);
    cout.tie(0);
    cin >> N;
    cin >> pattern;
    for(int i = 0; i < pattern.size(); i++){
        if(pattern[i] == '*'){ 
            flag = 1;
            continue;
        }
        if(flag == 0) Front += pattern[i];
        else Back += pattern[i];
    }
    for(int i = 0; i < N; i++){
        string x;
        bool correct = true;
        cin >> x;
        memset(check, 0, sizeof(check));
        for(int i = 0; i < Front.size(); i++){
            if(x[i] != Front[i]) correct = false;
            check[i] = 1;
        }
        
        for(int i = 0; i < Back.size(); i++){
            if(check[x.size() - Back.size() + i] == 1) correct = false;
            if(x[x.size() - Back.size() + i] != Back[i]) correct = false;
            check[i] = 1;
        }
        if(correct) cout << "DA" << "\n";
        else cout << "NE" << "\n";
    }
    return 0;
}

 

 

질문 및 조언은 댓글을 남겨주세요