728x90
https://www.acmicpc.net/problem/1759
1759번: 암호 만들기
첫째 줄에 두 정수 L, C가 주어진다. (3 ≤ L ≤ C ≤ 15) 다음 줄에는 C개의 문자들이 공백으로 구분되어 주어진다. 주어지는 문자들은 알파벳 소문자이며, 중복되는 것은 없다.
www.acmicpc.net
아무 생각 없이 풀어서 한 번 틀렸다.
우선 입력받은 배열을 바로 정렬하고, 그 배열로 부분집합을 만드는 것까지는 바로 생각이 난다.
하지만 그렇게 만든 부분집합에서 조건으로 걸러야 한다.
make_key(cur_candidate + [candidate[index]], index + 1)
make_key(cur_candidate, index + 1)
이렇게 재귀함수로 현재의 값을 추가하는 집합 하나, 추가하지 않는 집합 하나를 만들어준다.
def make_key(cur_candidate, index):
if index == C:
value = len(set(cur_candidate).intersection(important))
if len(cur_candidate) == L and value >= 1 and (L - value) >= 2:
for i in cur_candidate:
print(i, end='')
print()
return
else:
make_key(cur_candidate + [candidate[index]], index + 1)
make_key(cur_candidate, index + 1)
이렇게 하나씩 추가하다가 인덱스가 C를 넘어갔을 때, 현재 부분집합의 길이가 L이고 모음이 하나 이상 있고 자음이 2개 이상 있을 때만 출력이 되도록 해줬다.
import sys
L, C = map(int, sys.stdin.readline().split())
candidate = sorted(list(map(str, sys.stdin.readline().split())))
important = {'a', 'e', 'i', 'o', 'u'}
def make_key(cur_candidate, index):
if index == C:
value = len(set(cur_candidate).intersection(important))
if len(cur_candidate) == L and value >= 1 and (L - value) >= 2:
for i in cur_candidate:
print(i, end='')
print()
return
else:
make_key(cur_candidate + [candidate[index]], index + 1)
make_key(cur_candidate, index + 1)
make_key([], 0)
'알고리즘 > 브루트포스' 카테고리의 다른 글
백준 14501 퇴사 (0) | 2024.01.15 |
---|---|
백준 1182 부분수열의 합 (0) | 2024.01.15 |
백준 4675 셀프 넘버 (1) | 2024.01.15 |
백준 1065 한수 (0) | 2024.01.15 |
게임판 덮기 (0) | 2022.09.17 |