2024. 10. 5. 14:04ㆍCoding/백준-Python
1. 문제 링크
https://www.acmicpc.net/problem/1759
2. 문제
3. 소스코드 및 해설
- 백트래킹 알고리즘 사용
- 암호의 길이는 주어진 값 L이어야 한다.
- 암호는 최소 한 개의 모음과 최소 두 개의 자음으로 구성되어야 한다.
#전체 코드
vowel = ['a', 'e', 'i', 'o', 'u']
L, C = map(int, input().split())
words = input().split()
words.sort()
def check(arr):
v_count, c_count = 0, 0
for i in arr:
if i in vowel:
v_count += 1
else:
c_count += 1
if v_count >= 1 and c_count >= 2:
return True
else:
return False
def backtracking(arr):
if len(arr) == L:
if check(arr):
print("".join(arr))
return
for i in range(len(arr), C):
if arr[-1] < words[i]:
arr.append(words[i])
backtracking(arr)
arr.pop()
for i in range(C - L + 1):
a = [words[i]]
backtracking(a)
1) 기본 세팅
vowel = ['a', 'e', 'i', 'o', 'u']
-모음 목록 정의. 암호에 최소 한 개 이상의 모음이 있어야 하므로, 모음을 식별하기 위해 사용된다.
L, C = map(int, input().split())
words = input().split()
words.sort()
L : 암호의 길이
C : 주어진 문자들의 총 개수
words: 암호를 만들 수 있는 문자들의 리스트
- 문자들을 사전 순으로 정렬하여, 이후에 사전순으로 암호를 생성할 수 있도록 한다.
2) 모음과 자음의 개수 체크 함수 check(arr) 사용
def check(arr):
v_count, c_count = 0, 0
for i in arr:
if i in vowel:
v_count += 1
else:
c_count += 1
if v_count >= 1 and c_count >= 2:
return True
else:
return False
-check(arr) 함수: 선택된 문자 배열 arr에서 모음의 개수(v_count)와 자음의 개수(c_count)를 세고, 모음이 1개 이상이고 자음이 2개 이상인 경우 True를 반환하여 암호 조건을 만족하는지 확인한다.
3) 백트래킹 함수 사용 (backtracking(arr))
def backtracking(arr):
if len(arr) == L:
if check(arr):
print("".join(arr))
return
- 백트래킹을 통해 암호를 구성
- arr는 현재 선택된 문자들의 배열
- 만약 arr의 길이가 암호 길이인 L과 같아졌을 때, check(arr) 함수를 호출하여 조건을 만족하는지 확인한다. 조건을 만족하면 그 배열을 출력한다.
for i in range(len(arr), C):
if arr[-1] < words[i]:
arr.append(words[i])
backtracking(arr)
arr.pop()
- for 루프는 백트래킹을 수행하며, 배열의 마지막 문자보다 사전 순으로 큰 문자를 추가하면서 새로운 배열을 생성한다.
- 문자를 배열에 추가하고, 재귀적으로 다시 백트래킹을 호출한다.
- 재귀 호출이 끝나면 마지막 문자를 제거(pop())하여 다시 탐색을 계속한다.
4) 초기 백트래킹 호출
for i in range(C - L + 1):
a = [words[i]]
backtracking(a)
- 백트래킹의 시작점으로, words 리스트에서 문자를 하나씩 선택하여 backtracking 함수로 넘긴다. words[i]는 첫 번째 선택된 문자로 시작하며, 이후 나머지 문자들이 차례로 추가된다.
'Coding > 백준-Python' 카테고리의 다른 글
[백준] 백준 python3 1978번 문제 및 소스코드 (0) | 2024.10.08 |
---|---|
[백준] 백준 Python3 2166번 문제 및 소스코드 (0) | 2024.10.08 |
[백준] 백준 python 14725번 문제 및 소스코드 (0) | 2024.10.07 |
[백준] 백준 python 2293번 문제 및 소스코드 (1) | 2024.10.06 |
[백준] 백준 python 2110번 문제 및 소스코드 (0) | 2024.10.05 |