Codewars Scramblies 알고리즘

2019-07-30

Scramblies 알고리즘 문제는 s1s2를 인자로 받아 s1에 있는 문자들로 s2의 단어를 만들 수 있으면 True아니면 False를 출력하는 문제다.

그래서 아래와 같은 방법으로 풀어봤는데 왠지 무작위 검사에서 자꾸 두문제씩 틀렸다.

방법을 바꿔봐도 안되길래 찾아보니 다른 답이 있었는데 사용한 기능이 많아 정리하려한다.

시도했던 풀이

set_s2 = set(s2)
    set_s1 = set(s1)
    c = {}
    
    c = set_s1 & set_s2
    
    if set_s2 in c:
        return True
    else:
        return False
def scramble(s1, s2):
    coll = set(s2)
    
    for i in s2:
        if i not in s1:
            return False
        else:
            coll.discard(i)
        
    if len(coll) <= 0:
        return True
    else:
        return False

정답

def scramble(s1, s2):
    return all( s1.count(x) >= s2.count(x) for x in set(s2))

set은 집합을 만들어 주는데 특징으로는 순서, 중복 그리고 Key가 없다.

dict와 동일하게 중괄호를 사용하므로 중괄호만으로는 생성이 불가하다.

s=set()

count(x)는 x가 몇 개인지 조사하여 개수를 반환한다.

all(x)는 iterable 자료형 x를 인수로 받아 x가 모두 참이면 True 하나라도 거짓이면 False를 반환한다.

for x in set(s2)를 통해 s2에서 문자열 하나씩 x에 넣어준다.

그리고 x라는 문자열이 s1s2에 있는지 체크한다.

s1에 들어있는 문자열의 개수가 s2와 같거나 더 많으면 s1의 문자열로 s2의 문자를 생성 가능하다는 의미이므로 True이다. 이 작업을 반복한다. 즉 s2를 만드는데 필요한 문자열이 s1에 더 많거나 같게 있으면 참이고 하나라도 없으면 거짓이다.