코드
from sys import stdin, maxsize
input = stdin.readline
def dfs(start):
global ans, z, m
if len(ans) == L:
if z >= 2 and m >= 1:
print(''.join(ans))
return
for i in range(start, C):
char = charset[i]
if char not in ans:
if char in ['a', 'e', 'i', 'o', 'u']:
m += 1
else:
z += 1
ans.append(char)
dfs(i)
ans.pop(-1)
if char in ['a', 'e', 'i', 'o', 'u']:
m -= 1
else:
z -= 1
L, C = map(int, input().split())
charset = list(input().split())
charset.sort()
ans = []
z = 0
m = 0
dfs(0)
결과
풀이 방법
- N과 M 유형의 문제와 유사한 문제이다.
백트래킹
을 활용하는 문제이고 백트래킹은 DFS로 구현하였다.
- 정답에 문자를 추가할 때 자음/모음 개수를 증가시키고, DFS 수행 후 다시 문자를 제거할 때는 자음/모음 개수를 원래대로 돌려놓는다.
- charset에서 현재 방문중인 문자 다음 인덱스의 문자들만 가지고 이후 문자열을 만들어야 하므로 start 매개변수를 사용하였다.