SWEA 9480. 민정이와 광직이의 알파벳 공부(Python)

Wjong·2023년 1월 23일
1

swea

목록 보기
1/36

DFS를 이용하는 문제다.
N개의 단어를 입력받아, 각 단어마다 소문자들을 집합으로 만들어 list에 추가 후,
DFS로 모든경우를 돌며 해당 idx의 단어집합과 현재까지 집합을 더해 길이가 26(소문자26개)이 되는지 확인하고 26일경우 cnt를 1 올려준다.
특정 idx에서 26개가 다 충족될 경우, 뒤의 단어들은 굳이 확인할필요 없이 cnt를 더해주는 작업만 해줘도 될것 같지만.. 중복되는 경우를 판별해주어야해서 일단 pass!
시간나면 충분히 최적화가 가능한 로직이다.

def apd(word):
    ress=set()
    for i in word:
        if ord(i)>=97 and ord(i)<=122:
            ress.add(i)
    return ress

def dfs(sets,idx):
    global cnt
    if idx==N:
        return
    if len(sets|words[idx])==26:
        cnt+=1
    visit[idx]=True
    dfs(sets|words[idx],idx+1)    
    visit[idx]=False
    dfs(sets,idx+1)

res=[]
for m in range(int(input())):
    cnt=0
    N=int(input())
    words=[]
    for i in range(N):
        words.append(apd(input()))
    visit=[0]*(N+1)
    dfs(set(),0)
    res.append(cnt)
    
for i in range(len(res)):
    print("#%d %s"%(i+1,res[i]))
profile
뉴비

0개의 댓글