꾸준하게 거북이처럼

백준 애너그램 파이썬 본문

Algorithm 문제 & 공부/완전탐색

백준 애너그램 파이썬

somm12 2023. 4. 30. 09:33

 

 

6443번: 애너그램

첫째 줄에 단어의 개수 N 이, 둘째 줄부터 N개의 영단어가 들어온다. 영단어는 소문자로 이루어져 있다. 단어의 길이는 20보다 작거나 같고, 애너그램의 수가 100,000개 이하인 단어만 입력으로 주

www.acmicpc.net

백트래킹 문제로, 알파세 사전순으로 출력은 입력받을 때, sort를 적용하면 된다.

하지만 중복된 문자열은 출력 되면 안되기 때문에 이 조건에서 고민을 했던것 같다. 시간 초과가 나지 않으려면, 중복조건은 피해야하는데 어떻게 풀 수 있을까?

'aabc' 이 입력일 때, 

중복된 문자열을 피하려면, 재귀함수를 호출하며 가지가 뻗어나갈 때, 해당 depth에서 같은 문자가 가지에 포함되면 안된다. 하지만 주어진 문자열의 문자들을 다 사용해서 문자열을 만들어야하는 것이 목표다. 

이 생각으로부터 dictionary를 사용해서 현재 사용할 수 있는 각 알파벳의 개수를 +-1 을 해서 문자열을 만들어 나갈 수 있다.

dictionary를 사용하면 중복을 제거 할 수 있고, 각 알파벳에 대한 개수를 나타냄으로써 개수가 0보다 크면, 이어서 가지를 뻗어 나갈 수 있다.

def dfs(L,res):
    if L == len(arr):
        print(''.join(res))
        return
    for v in check:
        if check[v]:
            check[v] -= 1
            dfs(L+1,res+[v])
            check[v] += 1
        
            
n = int(input())
for _ in range(n):
    arr = list(input())
    arr.sort()
    check = {}
    for i in arr:
        if i not in check:
            check[i] = 1
        else:
            check[i] += 1
    dfs(0,[])

 

 

 

[baekjoon] 백준 6443번(파이썬): 애너그램

문제 9081번: 단어 맞추기 입력의 첫 줄에는 테스트 케이스의 개수 T (1 ≤ T ≤ 10)가 주어진다. 각 테스트 케이스는 하나의 단어가 한 줄로 주어진다. 단어는 알파벳 A~Z 대문자로만 이루어지며 항

fre2-dom.tistory.com

 

Comments