본문 바로가기
이것저것

leetcode 139. Word Break

by 문자메일 2022. 3. 9.

정답 소스

 

class Solution:
    def wordBreak(self, s: str, wordDict: List[str]) -> bool:

        # ex) s : leetcode
        # s[0:7]
        n = len(s)
        print(s[7])
        #dp[0:8]
        dp = [i==0 for i in range(n+1)]
        
        # i : 0 ~ 8
        for i in range(n+1):
            # j : 0 ~ 7(max)
            for j in range(i):
                if dp[j] == True and s[j:i] in wordDict:
                    dp[i] = True
                    break
        return dp[-1]

 

 

 

문제 해결 idea

dict의 단어 조합으로 만들어 질 수 있는 문자열 S의 subword를 2중 for문으로 찾고,

찾은 index+1의 dp 값을 dp[index+1] = True로 표기하여 dp[] 리스트에서 특정 index의 값이 True로 되어 있다면 그 이전 subword들은 dict의 단어 조합으로 만들 수 있다고 판단하는 방법이다.

 

ex: 아래 단어에서 leet를 먼저 찾은 경우 dp 값의 변화

S = leetcode

dp = [False,False,False,False,False,False,False,False,False]

 

위 상태에서 leet 단어를 찾은 경우(s[0:4]) dp 리스트의 변화 (i:4, j:0 일 때)

dp[4] = True

dp = [False,False,False,False,True,False,False,False,False]

 

위 상태에서 code 단어를 찾은 경우(s[4:8]) dp 리스트의 변화 (i:8, j:4 일 때)

dp[8] = True

dp = [False,False,False,False,True,False,False,False,True]

 

 

dp 리스트에서 문자열 리스트 S의 마지막 인덱스+1 의 값이 True라면 (dp[len(s)] == True), wordDict의 구성요소 단어들로 문자열 S를 만들 수 있음을 알 수 있고 True 값을 return한다.

 

하지만 만들 수 없다면 False를 return하게 된다.

 

 

댓글