상상쓰

[백준] 문자열 판별 본문

Coding Test

[백준] 문자열 판별

상상쓰 2021. 10. 7. 14:18

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

 

16500번: 문자열 판별

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

www.acmicpc.net

 

A에 포함된 문자열을 한 개 이상 붙일 수 있으므로 dp[index] 가 1이면 이미 재귀함수로 A의 문자열로 S를 만들 수 있는지 확인하고 있으므로 무시해도 된다.

 

DFS 알고리즘으로 

S = 'softwarecontest'

A = ['software', 'contest'] 라면

1) index = 0 (dp[0] = 1) : softwarecontest(= S[0:]) 와 software

  1 - 1) index = 0 + len('software') = 8 (dp[8] = 1) : contest(= S[8:]) 와 contest

  1 - 2) index = 8 + len('contest') = 15 가 len(S) 랑 일치하는 경우 dp[-1] = 1

2) index = 0 : softwarecontest 와 contest, index = 0 에서 일치하지 않으므로 break

 

dp[-1] 을 반환한다.

 

import sys

def rf(index):
    if index == len(S):
        dp[-1] = 1
        return
    else:
        if dp[index] != 1:
            dp[index] = 1
            
            for i in range(N):
                if len(S[index:]) >= len(A[i]):
                    for j in range(len(A[i])):
                        if S[index+j] != A[i][j]:
                            t = False
                            break
                            
                    else:
                        rf(index + len(A[i]))
                    
S = sys.stdin.readline().strip()
N = int(sys.stdin.readline())
A = []

for i in range(N):
    A.append(sys.stdin.readline().strip())

dp = [0] * (len(S) + 1)
rf(0)

print(dp[-1])

'Coding Test' 카테고리의 다른 글

[백준] K번째 수  (0) 2021.10.09
[백준] 피보나치 함수  (0) 2021.10.08
[백준] 5의 수난  (0) 2021.10.06
[프로그래머스] 9주차_전력망을 둘로 나누기  (0) 2021.10.05
[백준] 가장 긴 증가하는 부분 수열  (0) 2021.10.04
Comments