Word Break

유승선 ·2023년 1월 16일
0

LeetCode

목록 보기
73/122

요즘 들어 코딩테스트 관련해서 현타가 제대로 온거같다...진짜 취업 못했으면 아마 지금쯤 엄청난 현타가 왔을거 같아서 너무 무섭다. 내 현실에 그래도 다행이라고 생각한다. 퇴근하고 와서 한 문제라도 푸는게 목표인데 요즘은 문제를 도전하려고 하면 자꾸 답 부터 찾으려고 하는 버릇이 있는거같아서 좀 꾸준히 앉아서 열심히 해보고 노력해보고 싶다.

최근들어 DP 문제를 좀 자주 풀기는 하는데 아직도 감이 올듯 안올듯 하는거같다. 지금까지 풀었던 Stocks 문제도 다 정리해야하는데 천천히 해야곘다. 먼저, 이 문제는 wordDict 안에 있는 문자열을 사용해서 s를 나눌 수 있는지 물어보는 문제다. 원래 이 문제를 그냥 Brute Force로 풀게 된다면은 딕셔너리를 하나씩 확인하고 단어 하나씩 확인하는 번거로움이 있었을것이다. 그렇지만 DP 테이블을 이용해서 만들 수 있는 문자열에 True 값을 넣어줌으로 wordDict는 여러번 읽겠지만 결국 큰 틀에서 보면은 시간을 줄여서 런할 수 있다.

가장 처음에 dp[0] 는 true 값으로 해놓고 그 다음부터 세트를 읽을때는 substring 함수를 이용해서 wordDict의 단어 중 하나라도 만들 수 있다면 해당 문자의 위치에 True 값을 넣어주었다. 이렇게 끝까지 가게되면 결국 남는 문자열을 확인할 수 있고 답을 얻을 수 있을것이다.

class Solution {
    public boolean wordBreak(String s, List<String> wordDict) {
        boolean[] dp = new boolean[s.length()+1]; 
        dp[0] = true; 
        Set<String> newSet = new HashSet<>(); 
        newSet.addAll(wordDict); 
        
        for(int i = 1; i <= s.length(); i++){
            for(String words : newSet){
                if(i < words.length()) continue; 
                if(dp[i - words.length()] && newSet.contains(s.substring(i - words.length(), i))){
                    dp[i] = true; 
                }
            }
        }
        
        
        return dp[s.length()]; 
    }
}
profile
성장하는 사람

0개의 댓글