허비의 기술블로그

[BOJ] 암호 만들기(1759) - PYTHON 본문

BOJ

[BOJ] 암호 만들기(1759) - PYTHON

허비1411 2022. 6. 8. 21:16

암호의 길이 L과 암호에 들어갈 후보 C개의 문자가 입력이 들어오면, 암호가 될 수 있는 모든 문자열들을 출력하는 문제다.

단 암호는 문자가 중복되지 않으며, 모음이 1개 이상이고 자음이 2개 이상이다. 또한 암호는 오름차순으로 정렬돼있다.

 

1759번: 암호 만들기

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

www.acmicpc.net


풀이 과정

후보 문자열에서, 암호로 뽑을 L개의 문자를 선별한다. 이때 파이썬에선 Collections 모듈의 Combinations 함수를 사용하면 조합을 쉽게 구할 수 있다. 또 암호는 정렬돼있으므로 후보 문자열을 입력받은 다음에 정렬을 하고 Combinations 함수의 인자로 넣으면 결과로 나온 조합의 배열 또한 정렬된 상태다. 

가능한 조합을 구한 다음에 해당 문자열이 모음 1개, 자음 2개 이상인지 확인하고 맞다면 정답으로 출력한다.


코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
from itertools import combinations
 
L, C = map(int, input().split())
cset = input().split()
cset.sort()
comb = combinations(cset, L)
answer = []
 
for indices in comb:
    m = 0
    j = 0
    for c in indices:
        if c in ['a''e''i''o''u']:
            m += 1
        else:
            j += 1
    if m < 1 or j < 2:
        continue
    answer.append(''.join(list(indices)))
 
for v in answer:
    print(v)
cs

주석 추가

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
from itertools import combinations
 
L, C = map(int, input().split())  # 암호의 길이, 후보 문자열의 길이
cset = input().split()  # 후보 문자열
cset.sort()  # 후보 문자열 오름차순 정렬
comb = combinations(cset, L)  # 가능한 조합 경우의 수 구하기 (개수: NCL)
answer = []  # 정답 문자열을 담을 list
 
for indices in comb:  # 각 조합 경우의 수 마다
    m = 0  # 모음의 개수
    j = 0  # 자음의 개수
    for c in indices:  # 각 문자를 비교하며
        if c in ['a''e''i''o''u']:  # 모음이라면
            m += 1
        else:  # 자음이라면
            j += 1
    if m < 1 or j < 2:  # 모음의 개수가 1개 미만이거나, 자음의 개수가 2개 미만이라면 pass
        continue
    answer.append(''.join(list(indices)))  # 조합 경우의 수를 list로 변환 후 join함수를 통해 문자열로 변환, 이후 정답 배열에 추가
 
for v in answer:  # 정답 배열의 요소를 차례로 출력
    print(v)
cs

 

정답 배열을 따로 만들지 않고 19번째 줄에서 문자열을 그대로 출력해도 된다.


채점 결과

'BOJ' 카테고리의 다른 글

[BOJ] 카드 구매하기(11052) - PYTHON  (0) 2022.06.23
[BOJ] 제곱수의 합(1699) - PYTHON  (0) 2022.06.20
[BOJ] 연구소(14502) - PYTHON  (0) 2022.06.06
[BOJ] 연결 요소의 개수(11724) - PYTHON  (0) 2022.06.05
[BOJ] 이친수(2193) - PYTHON  (0) 2022.06.04
Comments