본문 바로가기
ps

[백준] 16500 - 문자열 판별

by kariskan 2023. 6. 20.

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

 

16500번: 문자열 판별

첫째 줄에 길이가 100이하인 문자열 S가 주어진다. 둘째 줄에는 A에 포함된 문자열의 개수 N(1 ≤ N ≤ 100)이 주어진다. 셋째 줄부터 N개의 줄에는 A에 포함된 단어가 한 줄에 하나씩 주어진다. A에

www.acmicpc.net

 

이 문제는 처음 봤을 때는 완전 탐색 문제일 줄 알았다.

하지만 다음과 같은 입력이 들어온다면?

 

aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(a가 홀수개)
8
aa
aaaa
aaaaaa
aaaaaaaaaa
aaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

 

이런 식으로 입력이 들어온다면 답은 0이지만, 완전 탐색 시 분명히 시간 초과를 맞게 될 것이다.

 

그럼 어떻게 풀어야 할까?

잘 생각해보면, "공백 없이 붙여서"라는 부분을 볼 수 있는데, 즉 문자열 S의 어떤 index까지 만들 수 있으면, 그 이전에 과정은 중요치 않다는 것이다. 따라서 이 문제는 dp로 풀 수 있다.

 

#include <iostream>
#include <vector>
using namespace std;

string s;
string v[100];
int n, dp[100];

int main() {
    cin >> s >> n;

    for (int i = 0; i < n; i++) {
        cin >> v[i];
    }

    for (int i = 0; i < s.length(); i++) {
        for (int j = 0; j < n; j++) {
            int len = v[j].length();
            if ((i == 0 || dp[i - 1]) && i + len <= s.length() &&
                s.substr(i, len) == v[j]) {
                dp[i + len - 1] = 1;
            }
        }
    }
    cout << dp[s.length() - 1];
}

'ps' 카테고리의 다른 글

[백준] 16678 - 모독  (0) 2023.06.20
[백준] 2831 - 댄스 파티  (0) 2023.06.20
[백준] 1765 - 닭싸움 팀 정하기  (0) 2023.06.20
[백준] 16400 - 소수 화폐  (0) 2023.02.14
[백준] 2022 - 사다리  (0) 2023.02.14

댓글