728x90
반응형
문제 바로가기
문제:
씬디는 애너그램(anagram) 프로그램을 만들어 줄 수 있는 남자를 좋아한다. 참고로 씬디는 매우 예쁘다. 애너그램 프로그램이란, 입력받은 영단어의 철자들로 만들 수 있는 모든 단어를 출력하는 것이다. 가령 "abc" 를 입력받았다면, "abc", "acb", "bac", "bca", "cab", "cba" 를 출력해야 한다. 입력받은 단어내에 몇몇 철자가 중복될 수 있다. 이 경우 같은 단어가 여러 번 만들어 질 수 있는데, 한 번만 출력해야 한다. 또한 출력할 때에 알파벳 순서로 출력해야 한다.
입력:
첫째 줄에 단어의 개수 N 이, 둘째 줄부터 N개의 영단어가 들어온다. 영단어는 소문자로 이루어져 있다. 단어의 길이는 20보다 작거나 같고, 애너그램의 수가 100,000개 이하인 단어만 입력으로 주어진다.
출력:
각각의 영단어마다 모든 가능한 애너그램을 출력한다. 각각의 영단어에 대한 애너그램을 출력할 때, 알파벳 순서로 중복되지 않게 출력한다.
풀이:
시간초과:
import sys
from itertools import permutations
sys.stdin = open('/Users/song/Desktop/Python/Python/h.txt', 'r')
n = int(input())
for i in range(n):
lst = list(input())
lst.sort()
sets =set()
for j in permutations(lst,len(lst)):
sets.add(("".join(j)))
res = sorted(list(sets))
for word in res:
print(word)
permutations 를 쓰면 시간 초과가 난다. 이중 포문이라 그런듯 하다
정답 코드:
import sys
from collections import defaultdict
from itertools import permutations
sys.stdin = open('/Users/song/Desktop/Python/Python/h.txt', 'r')
n = int(input())
def bt(count):
# 길이만큼 만들면
if count == len(word):
# 정답 프린트 해주고
print("".join(res))
# 리턴
return
# dic 돌면서
for i in dic:
if dic[i]:
# 사용 했으니깐 1 빼주고
dic[i] -= 1
# i 를 단어에 추가 해줌
res.append(i)
# 다음 재귀 출발
bt(count+1)
# 돌아오면 다시 복구 사용 안 한것 처럼 해줘야함
dic[i] += 1
# res에 넣은것도 당연히 빼줘야함
res.pop()
return
for _ in range(n):
word = sorted(list(map(str, sys.stdin.readline().strip())))
res = []
dic = defaultdict(int)
for w in word:
dic[w] += 1
# 반복문을 통해 visited에 알파벳의 개수를 입력
bt(0)
디폴트 딕이랑 백트래킹으로 풀어줬다.
반응형
댓글