728x90
1759번: 암호 만들기
첫째 줄에 두 정수 L, C가 주어진다. (3 ≤ L ≤ C ≤ 15) 다음 줄에는 C개의 문자들이 공백으로 구분되어 주어진다. 주어지는 문자들은 알파벳 소문자이며, 중복되는 것은 없다.
www.acmicpc.net
📄 문제개요
- 암호의 후보의 단어가 주어졌을때, 암호를 만들 수 있는 모든 경우의 수를 구한다.
- 암호는 문자가 오름차순이어야한다. 동일한 문자는 올 수 없다.
- 모음의 개수는 1개이상, 자음의 개수는 2개 이상 이어야한다.
🤔 문제분석
- 완전탐색문제로, 가능한 모든 조합을 확인해보면서 문제를 해결 할 수 있다.
- 필자는 2가지의 사항으로 문제를 해결 하였다.
- DFS로 가능한 모든 경우의 수를 탐색해보기
- Python 내장 라이브러리 Combination 라이브러리를 사용하여 경우의 수 만들기
📝 의사코드
- 가능한 모든 경우의 수를 모두 구한다.
- 자음의 개수와 모음의 개수가 해당조건을 맞는지 확인한다.
💻 코드
- DFS로 가능한 조건 모두 구하기
import sys
input = sys.stdin.readline
mo_list = set(['a', 'e', 'i', 'o', 'u'])
L, C = map(int, input().split())
words = list(map(str, input().split()))
words.sort()
def dfs(word, ja, mo):
if len(word) >= L:
if ja >= 2 and mo >= 1:
return [word]
return []
result = []
for w in words:
if w not in word:
if len(word) and word[-1] > w:
continue
word += w
if w in mo_list:
result += dfs(word, ja, mo + 1)
else:
result += dfs(word, ja + 1, mo)
word = word[:len(word)-1]
return result
ans = dfs('', 0, 0)
for word in ans:
print(word)
- Combination 모듈을 사용한 모든 경우의수 구하기
import sys
from itertools import combinations
input = sys.stdin.readline
mo_list = set(['a', 'e', 'i', 'o', 'u'])
L, C = map(int, input().split())
words = list(map(str, input().split()))
words.sort()
for w in combinations(words, L):
mo_cnt = len(set(w) & mo_list)
if mo_cnt >= 1 and len(w) - mo_cnt >= 2:
print(''.join(w))
🎯 피드백 및 개선사항
- 완전탐색 문제의 경우, 필자가 풀었던 1번 사항과 2번사항을 모두 할 줄 알아야, 다양한 문제에 접근이 가능하다.
❓다른사람은 어떻게 풀었을까?
- 다른사람들 모두 위와 같은 내용으로 문제를 해결 하였다.
728x90
'알고리즘 > 백준' 카테고리의 다른 글
[백준] 17472번 : 다리만들기 2 (1) | 2023.12.06 |
---|---|
[백준] 1035번 : 조각움직이기 (1) | 2023.12.05 |
[백준] 1092번 : 배 (4) | 2023.12.04 |
[백준] 1285번 : 동전 뒤집기 (2) | 2023.12.02 |
[백준] 3109번 : 빵집 (2) | 2023.12.02 |