728x90
1759번: 암호 만들기
첫째 줄에 두 정수 L, C가 주어진다. (3 ≤ L ≤ C ≤ 15) 다음 줄에는 C개의 문자들이 공백으로 구분되어 주어진다. 주어지는 문자들은 알파벳 소문자이며, 중복되는 것은 없다.
www.acmicpc.net
풀이
혼자 풀다가 막혀서 다른 풀이를 봤다. 완전탐색을 위해 문자열을 쌓아두는 지역변수 리스트가 각각의 DFS마다 다르게 적용된다는 것을 알아야 풀 수 있는 문제였다. 살짝 헷갈리는 문제여서 잊을 때마다 풀어야겠다.
완전탐색을 하기 위한 dfs 함수를 선언한다.
depth를 더하며 돌다가 depth가 주어진 수 C가 되는 순간 완전탐색 리스트에 문자열을 추가하고 return한다.
완전탐색의 흐름은 이렇게 될 것이다.
4 6
a t c i s w
['a']
['a', 'c']
['a', 'c', 'i']
['a', 'c', 'i', 's']
['a', 'c', 'i', 't']
['a', 'c', 'i', 'w']
['a', 'c', 's']
['a', 'c', 's', 't']
['a', 'c', 's', 'w']
['a', 'c', 't']
['a', 'c', 't', 'w']
['a', 'c', 'w']
['a', 'i']
a를 넣고 c를 넣고 i를 넣으면서 재귀함수가 실행된다.
트리 구조로 뻗어나간다고 생각하면 이해가 쉽다.
코드
l, c = map(int,input().split())
pw = list(map(str,input().split()))
pw.sort()
password = []
wantam = []
# L자리의 암호를 얻기 위한 dfs
def dfs(depth, index, l, c):
if depth == l:
wantam.append(''.join(password))
return
for i in range(index, c):
password.append(pw[i])
# print(password) # 여기서 찍어보면 흐름을 이해하기 쉽다.
dfs(depth+1, i+1, l, c)
password.pop() # pop을 해주어야 값이 쌓이지 않는다.
def solution(arr):
for i in arr:
vows = 0
cons = 0
for j in i:
if j in 'aeiou':
vows += 1
else:
cons += 1
if vows>=1 and cons>=2:
print(i)
return
dfs(0,0,l,c)
solution(wantam)
'PS > Python' 카테고리의 다른 글
[문자열][BOJ / Python] 1316 - 그룹 단어 체커 (0) | 2020.10.05 |
---|---|
[BOJ / Python] 4673 - 셀프 넘버 / 구현 (0) | 2020.10.02 |
[BOJ / Python] 2812 - 크게 만들기 / 그리디 / 문제 데이터 추가 기여 (0) | 2020.09.29 |
[BOJ / Python] 5052- 전화번호 목록 / 문자열, 정렬 (0) | 2020.09.28 |
[BOJ / Python] 14196 - 거스름돈 (0) | 2020.09.05 |
최근댓글