스터디/알고리즘

[medium] 916. Word Subsets

졔부작 2022. 7. 30. 13:42
728x90
반응형

문제

https://leetcode.com/problems/word-subsets/

 

Word Subsets - LeetCode

Level up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview.

leetcode.com


풀이방법

words1의 단어들 중 words2의 모든 단어를 subset으로 가질 수 있는 단어들을 찾는 문제이다.

시간 절약을 위해 words2에 대한 전처리가 매우 중요했다.

  • words2의 단어들 중에 중복되는게 있을 수 있으므로 set으로 변환했다가 다시 list로 변환함으로써 중복을 제거한다.
  • words2의 모든 단어들을 커버할 수 있는 하나의 dict를 구성한다.

전체 words2에 대해 구성한 dict 를 포함하는 words1의 단어들을 리스트에 저장한다.

반응형

코드

class Solution:
    def wordSubsets(self, words1: List[str], words2: List[str]) -> List[str]:
        def makedic(word): #word에 속한 알파벳들에 대한 딕셔너리 구성
            dic = {}
            for c in word:
                if c in dic.keys():
                    dic[c] += 1
                else:
                    dic[c] =1
            return dic
        
        def checkdic(dict2, dict_total): #dict2의 구성요소들을 dict_total로 통합
            for key in dict2.keys():
                if key not in dict_total.keys():
                    dict_total[key] = dict2[key]
                elif dict_total[key] < dict2[key]:
                    dict_total[key] = dict2[key]
            return dict_total
        
        result = []
        words2 = list(set(words2)) #중복제거
        dict_total = {}
        for w2 in words2:
            dict2 = {}
            for c in w2:
                if c in dict2.keys():
                    dict2[c] += 1
                else:
                    dict2[c] = 1
            dict_total = checkdic(dict2, dict_total)

        for w1 in words1:
            dict1 = makedic(w1)
            flag = True
            for key in dict_total.keys():
                if key not in dict1:
                    flag = False
                    break
                if dict_total[key] > dict1[key]:
                    flag = False
                    break
            if flag:
                result.append(w1)
        return result
728x90
반응형