#문제

https://www.acmicpc.net/problem/16500

 

16500번: 문자열 판별

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

www.acmicpc.net

 

#작성 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#include <iostream>
#include <vector>
using namespace std;
 
string s;
int n;        // word의 개수. 
vector<string> word;
    
bool works(int idx){
    // s의 끝에 도달하면 true를 리턴한다. 
    if( idx==s.length() ){
        return true;
    }
    
    // s의 idx에서부터 word에 존재하는 단어 하나하나를 매칭시켜본다. 
    for(int i=0; i<n; i++){
        bool flag = true;
        
        // word[i]의 길이를 idx에 더했을 때 s의 길이를 벗어나면 이 문자는 비교하지않는다. 
        if( idx+word[i].length() > s.length() ) continue;
        
        // s의 idx부터 word[i]를 문자 하나하나 비교한다. 
        for(int ii=0; ii<word[i].length(); ii++){
            if( s[idx+ii] != word[i][ii] ){
                flag = false;
                break;    // 이 word는 매칭되지않으므로 break하고 다음 문자 매칭으로 넘어간다. 
            }
        }
        
        if( flag ){
            // word[i]로 s를 구성할 수 있다면 그 이하의 s의 대해서 재귀적으로 가능한지 검사한다.
            if( works(idx+word[i].length()) ) return true;
        }
    }
    return false;
 
int main(){
    cin>>s;
    cin>>n;
    for(int i=0; i<n; i++){
        string x;
        cin>>x;
        word.push_back(x);
    }
    
    if( works(0)==true ){
        cout<<"1\n";
    }
    else{
        cout<<"0\n";
    }
    return 0;
}
cs

##

s의 idx에서부터 각 word에 대해 매칭 검사를 하고,

포함되는 word가 있다면 해당 word의 길이만큼 idx에 더해서 그 위치부터 각 word에 대해 다시 매칭 검사를 한다.

'BOJ' 카테고리의 다른 글

BOJ 3085번 :: 사탕 게임  (0) 2020.02.04
BOJ 2309번 :: 일곱 난쟁이  (0) 2020.02.03
BOJ 11052번 :: 카드 구매하기  (0) 2020.02.03
BOJ 1699번 :: 제곱수의 합  (0) 2020.02.02
BOJ 9465번 :: 스티커  (0) 2020.02.02

+ Recent posts