문제풀이/백준

[C++] 백준 - 16500 : 문자열 판별

orubt 2020. 3. 18. 16:11
반응형

문제 링크

 

16500번: 문자열 판별

첫째 줄에 길이가 100이하인 문자열 S가 주어진다. 둘째 줄에는 A에 포함된 문자열의 개수 N(1 ≤ N ≤ 100)이 주어진다. 셋째 줄부터 N개의 줄에는 A에 포함된 단어가 한 줄에 하나씩 주어진다. A에 포함된 문자열은 알파벳 소문자로만 이루어져 있고, 길이는 100을 넘지 않는다.

www.acmicpc.net

 

풀이 ) DP

  입력을 받을 때 각 문자열의 길이에 대한 data를 저장한다.

  문자열 S를 앞에서부터 순회하면서 부분 문자열로 A의 문자열과 일치하는 경우 memo배열에서 길이에 해당되는 요소를 1로 만들어준다.

  이후에 부분 문자열을 A + A로 나눌 수 있는 경우도 1로 만들어준다.

 

#include <cstdio>
#include <algorithm>
#include <string.h>
using namespace std;

int memo[102];

int main(void)
{
    char s[102] = {0}, a[101][102] = {0, };
    int n, slen, alen[101] = {0, };

    scanf("%s%d", s, &n);
    for(int i = 1; i <= n; ++i){
        scanf("%s", a[i]);
        alen[i] = strlen(a[i]);
    }

    slen = strlen(s);
    for(int i = 1; i <= slen; ++i){
        for(int j = 1; j <= n; ++j){
            char tmp[102] = {0};
            if(i < alen[j])
                continue;
            else if(i == alen[j]){
                strncpy(tmp, s, i);
                if(!strcmp(tmp, a[j])){
                    memo[i] = 1;
                    break;
                }
            }
            else{
                if(!memo[i-alen[j]])
                    continue;
                strncpy(tmp, s+(i-alen[j]), alen[j]);
                if(!strcmp(tmp, a[j])){
                    memo[i] = 1;
                    break;
                }
            }
        }
    }
    printf("%d\n", memo[slen]);
    return 0;
}
반응형