본문 바로가기
백준알고리즘/백트래킹

(Python/🥇5)백준알고리즘 6443번: 애너그램

by windy7271 2023. 9. 30.
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)

 

디폴트 딕이랑 백트래킹으로 풀어줬다.

반응형

댓글