본문 바로가기
Algorithm/baekjoon

beakjoon 16500: 문자열 판별

by 갈잃자 2022. 6. 14.

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

 

16500번: 문자열 판별

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

www.acmicpc.net

초기에 문제를 읽고 백트래킹으로 구현을 하면 되겠다 싶어서 백트래킹과 dfs를 섞어서 구현을 하였지만 시간초과가 났다.

s = list(input())
n = int(input())
arr = []
for _ in range(n):
    arr.append(list(input()))


result = []
def dfs(level,word):
    if level == len(s):
        if s == word:
            result.append(1)
            return
        else:
            result.append(0)
            return
    if 1 in result:
        return

    if level > len(s):
        return

    for i in range(n):
        dfs(level+len(arr[i]),word+arr[i])
dfs(0,[])

if 1 in result:
    print(1)
else:
    print(0)

시간초과가 난 이유(반례)를 홀로 생각을 해보니.. 만약 길이가 100인 문자열을 입력받았다고 치자.

 

조합을 위한 단어들이 100개가 있는데 그 단어들이 전부 길이가 1인 단어라면 백트래킹을 이용해도 엄청난 시간이 걸릴것이다.

 

그래서 애초에 처음 index부터 맞는 조합을 맞췄다면 그 다음 index로 넘어가는 dp적인 개념이 필요하겠구나 생각했다..!

 

허나 dp는 아직 나에겐 많이 어려운 개념.. 구글링을 통해 다른분의 코드를 인용하여 결국 정답을 제출하였다 허허

s = list(input())
n = int(input())
arr = []
dp_arr = [0] * 101 #체크된 부분부터 탐색을 해야하므로 필요
for _ in range(n):
    arr.append(list(input()))
result = 0

def dp(idx):
    global result
    if idx == len(s): # idx가 입력받은 문자열과 같다면 return
        result = 1
        return
    if dp_arr[idx] ==1: 
        return
    dp_arr[idx] = 1

    for i in range(len(arr)):
        if len(s[idx:])>=len(arr[i]): # 입력받은 단어의 현 위치보다 조합할 단어의 길이가 더 크다면 못들어간다
            for j in range(len(arr[i])): 
                if arr[i][j] != s[idx+j]: # 조합할 단어와 입력받은 단어의 현 위치의 알파벳이 같지않다면 break
                    break
            else:
                dp(idx+len(arr[i])) # 단어조합에 성공하였다면 다음 idx부터 단어를 찾는다
    return

dp(0)
print(result)

 

'Algorithm > baekjoon' 카테고리의 다른 글

baekjoon 9081: 단어 맞추기  (0) 2022.06.27
baekjoon 2473: 세 용액  (0) 2022.06.22
backjoon 11055: 가장 큰 증가 부분 수열  (0) 2022.05.19
backjoon 2469: 사다리 타기  (0) 2022.05.17
baekjoon 14606: 피자(small)  (0) 2022.05.17

댓글