반응형
1. 문제 - 백준 1759 암호 만들기
https://www.acmicpc.net/problem/1759
💡알고리즘 - 백트래킹
- 특정 조건(최소 한 개의 모음, 최소 2개의 자음, c개 문자들 중 길이가 l인 문자열)을 만족하는 집합을 모두 구한다는 점에서
가지치기 -> 백트래킹을 유추할 수 있다.
l, c = map(int, input().split())
arr = sorted(list(input().split()))
visited = [False] * c
def count_moeum_zaeum(str): # 최소 한 개의 모음과 2개의 자음으로 구성되어있는지 확인하기 위한 함수
moeums = ["a", "e", "i", "o", "u"]
moeum = 0
zaeum = 0
for s in str:
if s in moeums:
moeum += 1
else:
zaeum += 1
return moeum >= 1 and zaeum >= 2
def backtracking(str, idx):
if count_moeum_zaeum(str) and len(str) == l: # 조건을 만족하면 출력 후 return한다.
print(str)
return
for i in range(idx, c): # idx부터 c까지의 문자열을 순회하며 가능성을 판단하기 위해 이후의 문자를 이어붙여본다.
if not visited[i]:
visited[i] = True
backtracking(str + arr[i], i)
visited[i] = False
"""
여기서 방문 여부를 복원하는 이유는, 예를들어 문제 예시처럼 a t c i s w 라는 문자열에서 조합을 만든다고 했을 때
a -> c -> ... 이런 순서로 방문하다가 다른 후보지를 살펴보기 위해 a -> i -> ... 이런순서로 방문할 수 있도록 해야한다.
방문 여부는 visited로 판단하고 있으므로, visited[i]를 방문하지 않은것으로 복원처리한다. ==> 가지치기
"""
backtracking("", 0)
반응형
'⚙️ 알고리즘 > 문제풀이' 카테고리의 다른 글
| [Python] 백준 16139 인간-컴퓨터 상호작용 (0) | 2025.11.23 |
|---|---|
| [Python] 백준 17141 연구소 2 (0) | 2025.11.23 |
| [Python] 백준 16434 드래곤 앤 던전 (0) | 2025.08.15 |
| [Python] 백준 1347 미로만들기 (0) | 2025.08.08 |
| [Python] 백준 4991 로봇 청소기, 백준 19637 IF문 좀 대신 써줘 (0) | 2025.08.07 |