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]))