Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 다이나믹프로그래밍
- BFS
- boj
- 플루이드-워셜
- 투포인터
- 해시맵
- 회의실 배정
- 브루트포스
- 이분탐색
- dfs
- 간단한 369게임
- SWEA
- N-Queen
- Flatten
- 최단경로
- 좌표 정렬하기
- 완전탐색
- D3
- 백만 장자 프로젝트
- 스도쿠 검증
- 다리놓기
- D2
- firebase
- 우선순위 큐
- 그리디 알고리즘
- LRU
- 에라토스테네스의체
- 배포
- 터렛
- 나는야 포켓몬 마스터 이다솜
Archives
- Today
- Total
허비의 기술블로그
[BOJ] 암호 만들기(1759) - PYTHON 본문
암호의 길이 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