꾸준하게 거북이처럼

백준 파이썬 1759번 본문

Algorithm 문제 & 공부/완전탐색

백준 파이썬 1759번

somm12 2022. 9. 18. 08:15
 

1759번: 암호 만들기

첫째 줄에 두 정수 L, C가 주어진다. (3 ≤ L ≤ C ≤ 15) 다음 줄에는 C개의 문자들이 공백으로 구분되어 주어진다. 주어지는 문자들은 알파벳 소문자이며, 중복되는 것은 없다.

www.acmicpc.net

재귀 함수 호출을 통해 C개 중 L개로 순열을 만들고, 자음 2개이상 모음 1개 이상인지 체크해야하는 문제이다.

여기서 나는 재귀 함수를 통해 순열이 길이가 L가 됐을 때, 자음으로만 구성된 경우인지만 검사했다. 그럼 최소 모음이 한 개일 테니까,,,

그럼 모두가 모음인 경우가 출력되버린다.. 입력자체에서 필터를 해주지 않기 때문에 검사가 필수!!!!!

따라서 느낀 것은, 예외를 놓치지 않으려면, 이러한 특정 조건이 문제에 제시되면! 숫자로 정확히 체크하는 것이, 정확이 빠르게 문제를 맞추는 길이다.

코드

def dfs(L):
    if L == n:
        cnt = 0
        # 모음이 res에 몇 개 있는지 개수 세기
        for v in nes:
            if v in res:
                cnt += 1
        #모음이 1개라도 존재, 자음도 2개이상 존재. => 이런 조건이 있다면 숫자로 해결하자. 놓치면 경우가 있다.
        if cnt > 0 and n - cnt >= 2:
            for val in res:
                print(val,end='')
            print()      

    else:
        for i in range(C):
            if ch[i] == 0:
                if (L == 0) or (res[L - 1] < arr[i]):
                    ch[i] = 1
                    res[L] = arr[i]
                    dfs(L + 1)
                    ch[i] = 0

n, C = map(int, input().split())
arr = list(input().split())
arr.sort()
# 결과를 담을 배열
res = [0] * n
# 이미 사용했는지 체크 배열
ch = [0] * C
# 모음 배열
nes = ['a','e','i','o','u']
dfs(0)

 

Comments